has_manyリレーションでSTIを使用すると、スーパークラスの関連付けを介して子オブジェクトにアクセスしたかったのですが、それ以前に行うことはできませんでした。2つのhas_many関連付けによってSTIテーブルにアクセスする方法はありますか?
これは私の状況に似たサンプルコードです。
class Parent < ActiveRecord::Base
has_many :children, class_name: 'Child', inverse_of: :parent
has_many :male_children, class_name: 'Children::Male'
has_many :female_children, class_name: 'Children::Female'
end
class Child < ActiveRecord::Base
belongs_to :parent, inverse_of: :children
end
class Children::Male < Child
end
class Children::Female < Child
end
私はサブクラスの関連付けなどにhas_manyの関連付けを設定すると、私はスーパークラスの関連付けを介してアクセスできませんでした。保存して再ロード親の後
parent = Parent.new
parent.male_children << Children::Male.new
parent.female_children << Children::Female.new
parent.children # => []
、ActiveRecordのは、データベースからのフェッチのように、もちろん私はスーパークラスの子の関連付けを得ることができます。
parent.save
parent.reolad
parent.children # => [#<Children::Male ...>, #<Children::Female ...>]
私はこの
class Parent < ActiveRecord::Base
...
def children
[male_children, female_children].flatten
end
end
ようなインスタンスメソッドを実装することによってこの問題を解決することができるが、私はいくつかの理由(予測、のparamsを割り当てる、など)のための関連付けを好みます。 アソシエーション定義を設定する方法を知っている人はいますか?これは不可能ですか?
実際のコードでは、クラスは男性/女性の子供ではありません。親子関係でトラブルを説明しようとしました。 実際のコードのサブクラスが異なる動作をするため、Male/Femaleの子クラスに異なる動作があるとすればうれしいです。 – tacamula