私のモデルには、親、子、および子の名前付きグループがあります。グループは親に属し、子は親に属し、子は同じ親のグループに属する場合があります。
グループは削除され、後で同じ名前で別の ID で再作成される場合があります。子は、グループが再作成された場合に同じグループに属するように、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 オブジェクトではなく、Child クラスです。
このような関連付けを熱心にロードするにはどうすればよいですか? それとも、私のモデル構造は愚かですか? グループの複合主キーは頭に浮かびましたが、レールはデフォルトでそれをサポートしていないので、私はむしろそうしません。