Est-il approprié de répéter des données dans les modèles pour satisfaire en utilisant la loi de Demeter dans les collections?
-
29-10-2019 - |
Question
Ceci est un exemple artificiel, disons que je veux énumérer la population d'un pays dans lequel une personne a un ami, voici deux configurations ci-dessous. Serait-il préférable de répéter des données dans les modèles?
On m'a dit que le Loi de Demeter est important à suivre, l'exemple est que vous dites à un chien de marcher, c'est la folie de commander ses jambes pour marcher.
Dans ma richesse d'inexpérience (noob), j'ai constaté que la requête serait beaucoup plus facile à faire lorsque les modèles répètent les données, People.where(:country => friend.country)
, vs collections où il y a des associations enchaînées (qui ont été impossibles jusqu'à présent): People.where(:city => { :county => { :region => { :country => friend.city.county.region.country }}})
(Cela aiderait vraiment ce noob ici à comprendre le concept si vous pouviez imaginer la configuration et la syntaxe de LOD correctement conçues, j'espère vraiment que je n'ai pas utilisé un exemple qui n'a rien à voir avec la loi de Demeter) J'ai essayé d'appliquer LOD passant par delegate
Et on m'a dit que je suis toujours en train de chaîner (ce que je suis), la seule solution à laquelle je peux penser est de répéter des données qui pourraient être accessibles via des associations.
Mais je déteste répéter les données! Cela est dû à la suite de Rails Tutuorial de DHH où nous recréons Twitter, il a montré à quel point il est génial de créer des relations par rapport aux données répétitives.
La répétition des données devrait-elle être appropriée pour obtenir les associations moins enchaînées?
Modèles, répétitif de données
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 modèles avec des associations enchaînées
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
Pas de solution correcte