В моей модели есть родители, дети и названные группы детей. Группы принадлежат родителям, дети принадлежат родителям, а дети могут принадлежать к группе одного и того же родителя.Рельсы: с нетерпением загрузка a принадлежит_to с: условиями, относящимися к себе
Группы могут быть удалены и впоследствии воссозданы с тем же именем, но с другим идентификатором. Ребенок ссылается на свою группу по имени, а не на id, так что он будет принадлежать к той же группе, если группа когда-либо воссоздана. Группа с тем же именем может существовать у нескольких родителей, поэтому нам нужно различать их.
class Parent < ActiveRecord::Base
has_many :groups
has_many :children
end
class Group < ActiveRecord::Base
belongs_to :parent
has_many :children,
:foreign_key => :group_name,
:primary_key => :name,
:conditions => proc { "children.parent_id = #{self.parent_id}" }
end
class Child < ActiveRecord::Base
belongs_to :parent
belongs_to :group,
:foreign_key => :group_name,
:primary_key => :name,
:conditions => proc { "groups.parent_id = #{self.parent_id}" }
end
Это прекрасно работает, пока я не попытаюсь с удовольствием загрузить группы детей. Child.where(...).includes(:group)
undefined method parent_id' for #<Class:0x00000002dcc290>
. self
в условиях proc - это класс Child, а не дочерний объект.
Как я могу загрузить такую ассоциацию? Или моя модельная структура просто глупо? Сложные первичные ключи для групп пересекаются разумом, но я бы предпочел, чтобы после того, как rails не поддерживает это по умолчанию.
Не работает, извините :(Rails (eager-) загружает группы с отдельной «SELECT .. . FROM groups WHERE name IN (...) AND whatever-is-in-: условия '. Запрос не относится к таблице children. – mpartel
Хммм, хорошо, выглядит так: опция finder_sql будет делать то, что вы хотите. Я также собираюсь обновить свой ответ. – Adam
Не работает. Принадлежность принадлежит в Child не использует finder_sql, и в соответствии с документами вы не можете использовать: finder_sql with belongs_to. – mpartel