mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-22 19:56:21 +00:00
testear la relación belongs_to
belongs_to indica que un artículo pertenece a otro, la relación inversa es un has_many. en este caso nos fuimos dando cuenta que las memoizaciones nos juegan en contra, así que las vamos eliminando del código cuando no hacen falta. utilizamos `value = value.filtrado` para aprovechar `MetadataTemplate#value=` que guarda el valor anterior en `MetadataTemplate#value_was` y nos permite comparar entre el valor anterior y el actual.
This commit is contained in:
parent
42923c4e04
commit
38c5cdef81
2 changed files with 53 additions and 18 deletions
|
@ -3,13 +3,6 @@
|
||||||
# Almacena el UUID de otro Post y actualiza el valor en el Post
|
# Almacena el UUID de otro Post y actualiza el valor en el Post
|
||||||
# relacionado.
|
# relacionado.
|
||||||
class MetadataBelongsTo < MetadataRelatedPosts
|
class MetadataBelongsTo < MetadataRelatedPosts
|
||||||
def value_was=(new_value)
|
|
||||||
@belongs_to = nil
|
|
||||||
@belonged_to = nil
|
|
||||||
|
|
||||||
super(new_value)
|
|
||||||
end
|
|
||||||
|
|
||||||
# TODO: Convertir algunos tipos de valores en módulos para poder
|
# TODO: Convertir algunos tipos de valores en módulos para poder
|
||||||
# implementar varios tipos de campo sin repetir código
|
# implementar varios tipos de campo sin repetir código
|
||||||
#
|
#
|
||||||
|
@ -39,10 +32,14 @@ class MetadataBelongsTo < MetadataRelatedPosts
|
||||||
|
|
||||||
# Si estamos cambiando la relación, tenemos que eliminar la relación
|
# Si estamos cambiando la relación, tenemos que eliminar la relación
|
||||||
# anterior
|
# anterior
|
||||||
belonged_to[inverse].value.delete post.uuid.value if changed? && belonged_to.present?
|
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
|
# No duplicar las relaciones
|
||||||
belongs_to[inverse].value << post.uuid.value unless belongs_to.blank? || included?
|
belongs_to[inverse].value = (belongs_to[inverse].value.dup << post.uuid.value) unless belongs_to.blank? || included?
|
||||||
|
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
@ -63,20 +60,13 @@ class MetadataBelongsTo < MetadataRelatedPosts
|
||||||
end
|
end
|
||||||
|
|
||||||
# El Post relacionado con este artículo
|
# El Post relacionado con este artículo
|
||||||
#
|
|
||||||
# XXX: Memoizamos usando el valor para tener el valor siempre
|
|
||||||
# actualizado.
|
|
||||||
def belongs_to
|
def belongs_to
|
||||||
return if value.blank?
|
posts.find(value, uuid: true) if value.present?
|
||||||
|
|
||||||
@belongs_to ||= posts.find(value, uuid: true)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# El artículo relacionado anterior
|
# El artículo relacionado anterior
|
||||||
def belonged_to
|
def belonged_to
|
||||||
return if value_was.blank?
|
posts.find(value_was, uuid: true) if value_was.present?
|
||||||
|
|
||||||
@belonged_to ||= posts.find(value_was, uuid: true)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def related_posts?
|
def related_posts?
|
||||||
|
|
45
test/models/metadata_belongs_to_test.rb
Normal file
45
test/models/metadata_belongs_to_test.rb
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'test_helper'
|
||||||
|
require_relative 'metadata_test'
|
||||||
|
|
||||||
|
class MetadataBelongsToTest < ActiveSupport::TestCase
|
||||||
|
include MetadataTest
|
||||||
|
|
||||||
|
test 'se pueden relacionar artículos' do
|
||||||
|
post = @site.posts.create(layout: :post, title: SecureRandom.hex)
|
||||||
|
reply = @site.posts.create(layout: :post, title: SecureRandom.hex, in_reply_to: post.uuid.value)
|
||||||
|
|
||||||
|
assert_equal post, reply.in_reply_to.belongs_to
|
||||||
|
assert_includes post.posts.has_many, reply
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'se puede eliminar la relación' do
|
||||||
|
post = @site.posts.create(layout: :post, title: SecureRandom.hex)
|
||||||
|
reply = @site.posts.create(layout: :post, title: SecureRandom.hex, in_reply_to: post.uuid.value)
|
||||||
|
|
||||||
|
reply.in_reply_to.value = ''
|
||||||
|
reply.save
|
||||||
|
|
||||||
|
assert_not_equal post, reply.in_reply_to.belongs_to
|
||||||
|
assert_equal post, reply.in_reply_to.belonged_to
|
||||||
|
assert_nil reply.in_reply_to.belongs_to
|
||||||
|
assert_not_includes post.posts.has_many, reply
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'se puede cambiar la relación' do
|
||||||
|
post1 = @site.posts.create(layout: :post, title: SecureRandom.hex)
|
||||||
|
post2 = @site.posts.create(layout: :post, title: SecureRandom.hex)
|
||||||
|
reply = @site.posts.create(layout: :post, title: SecureRandom.hex, in_reply_to: post1.uuid.value)
|
||||||
|
|
||||||
|
reply.in_reply_to.value = post2.uuid.value
|
||||||
|
reply.save
|
||||||
|
|
||||||
|
assert_not_equal post1, reply.in_reply_to.belongs_to
|
||||||
|
assert_equal post1, reply.in_reply_to.belonged_to
|
||||||
|
assert_not_includes post1.posts.has_many, reply
|
||||||
|
|
||||||
|
assert_equal post2, reply.in_reply_to.belongs_to
|
||||||
|
assert_includes post2.posts.has_many, reply
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue