В моей модели есть родители, дети и именные группы детей. Группы принадлежат родителям, дети принадлежат родителям, а дети могут принадлежать к группе одного и того же родителя.
Группы могут быть удалены, а затем созданы заново с тем же именем, но с другим идентификатором. Дочерний элемент обращается к своей группе по имени, а не по идентификатору, поэтому он будет принадлежать к той же группе, если группа когда-либо будет воссоздана. Группа с таким же именем может существовать у нескольких родителей, поэтому нам нужно различать их.
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, а не объект Child.
Как мне загрузить такую ассоциацию? Или моя модельная структура просто глупая? Составные первичные ключи для групп приходили в голову, но я бы не стал этого делать, поскольку rails не поддерживает это по умолчанию.