). Это правильно?
адуманный пример, скажем, я хочу перечислить население страны, в которой у человека есть друг, вот две схемы ниже. Будет ли лучше повторить данные в моделях?
Мне сказали, чтоЗакон Деметры важно следовать, например, вы говорите собаке ходить, глупо приказывать ногам ходить.
В моем богатстве неопытности (нуб) я обнаружил, что запрос будет гораздо проще выполнить, когда модели повторяют данные,People.where(:country => friend.country)
vs коллекции, в которых есть цепочечные ассоциации (которые до сих пор были невозможны):People.where(:city => { :county => { :region => { :country => friend.city.county.region.country }}})
(Это действительно помогло бы этому новичку понять концепцию, если бы вы могли представить правильную надуманную настройку и синтаксис LoD, я действительно надеюсь, что не использовал пример, который не имеет ничего общего с Законом Деметры) Я попытался применить LoD черезdelegate
и мне сказали, что я все еще в цепочке (что я и есть), единственное решение, о котором я могу думать, - это повторять данные, которые могут быть доступны через ассоциации.
Но я ненавижу повторять данные! Это связано с тем, что после того, как мы создали реферат в Твиттере в DHH, он показал, как здорово создавать отношения против повторяющихся данных.
Должны ли повторяющиеся данные быть уместными, чтобы ассоциации были менее скованы?
Модели, повторяющие данные
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
против моделей с цепными ассоциациями
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