Es apropiado repetir datos en modelos para satisfacer el uso de la ley de demeter en colecciones?
Este es un ejemplo artificial, digamos que quiero enumerar la población de un país en el que una persona tiene un amigo, aquí hay dos configuraciones a continuación. ¿Sería mejor repetir datos en los modelos?
Me han dicho que elLa ley de Demeter es importante seguirlo, el ejemplo es que le dices a un perro que camine, es una locura ordenarle a sus piernas que caminen.
En mi riqueza de inexperiencia (novato) he descubierto que la consulta sería mucho más fácil de hacer cuando los modelos repitan datos,People.where(:country => friend.country)
, vs colecciones donde hay asociaciones encadenadas (que hasta ahora han sido imposibles):People.where(:city => { :county => { :region => { :country => friend.city.county.region.country }}})
(Realmente ayudaría a este novato aquí a entender el concepto si pudieras imaginar la sintaxis y la configuración correcta de LoD, realmente espero no haber usado un ejemplo que no tenga nada que ver con la Ley de Demeter) He intentado aplicar LoD a través dedelegate
y me dijeron que todavía estoy encadenando (lo que estoy haciendo), la única solución que se me ocurre es repetir datos a los que se pueda acceder a través de asociaciones.
¡Pero odio repetir datos! Esto se debe a que, siguiendo el tutorial de Rails de DHH donde recreamos Twitter, demostró lo bueno que es crear relaciones en lugar de repetir datos.
Debería ser apropiado repetir los datos para que las asociaciones estén menos encadenadas?
Modelos, repitiendo datos
class Country < ActiveRecord::Base
has_many :regions
has_many :counties
has_many :cities
has_many :people
end
class Region < ActiveRecord::Base
has_one :country
has_many :counties
has_many :cities
has_many :people
end
class County < ActiveRecord::Base
has_one :country
has_one :region
has_many :cities
has_many :people
end
class City < ActiveRecord::Base
has_one :country
has_one :region
has_one :county
has_many :people
end
class Person < ActiveRecord::Base
has_one :country
has_one :region
has_one :county
has_one :city
has_many :relationships
has_many :friends, :through => :relationships
end
vs modelos con asociaciones encadenadas
class Country < ActiveRecord::Base
has_many :regions
end
class Region < ActiveRecord::Base
belongs_to :country
has_many :counties
end
class County < ActiveRecord::Base
belongs_to :region
has_many :cities
end
class City < ActiveRecord::Base
belongs_to :county
end
class Person < ActiveRecord::Base
belongs_to :city
end