sutty/app/models/metadata_belongs_to.rb
f cf67dbb0c3 Devolver el tipo de dato correcto
Como MetadataBelongsTo desciende de MetadataArray, al cambiar métodos de
MetadataArray tenemos efectos secundarios.

Esto es un hotfix, la solución correcta sería reimplementar
MetadataBelongsTo para que deje de ser un Array.
2021-07-12 16:52:44 -03:00

103 lines
2.2 KiB
Ruby

# frozen_string_literal: true
# Almacena el UUID de otro Post y actualiza el valor en el Post
# relacionado.
class MetadataBelongsTo < MetadataRelatedPosts
# 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
# Obtiene el valor desde el documento.
#
# @return [String]
def document_value
document.data[name.to_s]
end
def validate
super
errors << I18n.t('metadata.belongs_to.missing_post') unless post_exists?
errors.empty?
end
# Guardar y guardar la relación inversa también, eliminando la
# relación anterior si existía.
def save
super
# Si no hay relación inversa, no hacer nada más
return true unless changed?
return true unless inverse?
# Si estamos cambiando la relación, tenemos que eliminar la relación
# anterior
if belonged_to.present?
belonged_to[inverse].value = belonged_to[inverse].value.reject do |rej|
rej == post.uuid.value
end
end
# No duplicar las relaciones
belongs_to[inverse].value = (belongs_to[inverse].value.dup << 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
@inverse ||= layout.metadata.dig(name, 'inverse')&.to_sym
end
# El Post relacionado con este artículo
def belongs_to
posts.find(value, uuid: true) if value.present?
end
# El artículo relacionado anterior
def belonged_to
posts.find(value_was, uuid: true) if value_was.present?
end
def related_posts?
true
end
def related_methods
@related_methods ||= %i[belongs_to belonged_to].freeze
end
def indexable_values
belongs_to&.title&.value
end
private
def post_exists?
return true if sanitize(value).blank?
sanitize(value).present? && belongs_to.present?
end
def sanitize(uuid)
uuid.to_s.gsub(/[^a-f0-9\-]/i, '')
end
end