sutty/app/models/metadata_belongs_to.rb

102 lines
2.2 KiB
Ruby
Raw Normal View History

2020-07-02 14:25:04 +00:00
# frozen_string_literal: true
# Almacena el UUID de otro Post y actualiza el valor en el Post
# relacionado.
2020-07-02 14:25:04 +00:00
class MetadataBelongsTo < MetadataRelatedPosts
2021-02-11 19:17:45 +00:00
def value_was=(new_value)
@belongs_to = nil
@belonged_to = nil
super(new_value)
end
2020-07-02 14:25:04 +00:00
# TODO: Convertir algunos tipos de valores en módulos para poder
# implementar varios tipos de campo sin repetir código
#
# @include MetadataString
#
# Una string vacía
def default_value
''
end
def validate
super
2021-02-11 19:44:36 +00:00
errors << I18n.t('metadata.belongs_to.missing_post') unless post_exists?
2020-07-02 14:25:04 +00:00
errors.empty?
end
# Guardar y guardar la relación inversa también, eliminando la
# relación anterior si existía.
def save
2021-02-11 19:16:25 +00:00
super
# Si no hay relación inversa, no hacer nada más
2021-02-11 19:16:25 +00:00
return true unless changed?
return true unless inverse?
# Si estamos cambiando la relación, tenemos que eliminar la relación
# anterior
belonged_to[inverse].value.delete post.uuid.value if changed? && belonged_to.present?
# No duplicar las relaciones
belongs_to[inverse].value << post.uuid.value unless belongs_to.blank? || included?
true
end
# El Post actual está incluido en la relación inversa?
def included?
belongs_to[inverse].value.include?(post.uuid.value)
end
# Hay una relación inversa y el artículo existe?
def inverse?
inverse.present?
end
# El campo que es la relación inversa de este
def inverse
2021-02-11 19:44:36 +00:00
@inverse ||= layout.metadata.dig(name, 'inverse')&.to_sym
end
# El Post relacionado con este artículo
#
# XXX: Memoizamos usando el valor para tener el valor siempre
# actualizado.
def belongs_to
return if value.blank?
2021-02-11 19:17:45 +00:00
@belongs_to ||= posts.find(value, uuid: true)
end
# El artículo relacionado anterior
def belonged_to
return if value_was.blank?
@belonged_to ||= posts.find(value_was, uuid: true)
end
2020-07-22 23:35:43 +00:00
def related_posts?
true
end
def related_methods
@related_methods ||= %i[belongs_to belonged_to].freeze
end
2020-07-02 14:25:04 +00:00
private
2021-02-11 19:16:25 +00:00
def post_exists?
2021-02-11 20:57:12 +00:00
return true if sanitize(value).blank?
sanitize(value).present? && belongs_to.present?
2020-07-02 14:25:04 +00:00
end
2020-07-02 14:26:00 +00:00
2021-02-11 19:16:25 +00:00
def sanitize(uuid)
uuid.to_s.gsub(/[^a-f0-9\-]/i, '')
2020-07-02 14:26:00 +00:00
end
2020-07-02 14:25:04 +00:00
end