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

Respuestas a la pregunta(3)

Su respuesta a la pregunta