2017-08-07 10 views
0

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を割り当てる、など)のための関連付けを好みます。 アソシエーション定義を設定する方法を知っている人はいますか?これは不可能ですか?

答えて

0

あなたの男性/女性の子供が異なる行動をしていない場合、これはSTIを通してではなく、単に属性を使用して行うべきです。また、このモデルの種類は、子どもが通常2人の親を持つという事実を考慮すると短くなります。

大人のための属性を持っている場合は、あなたが行うことができます:

parent.children.where(sex: 'male') 

しかし、このため、あなたの質問に答えていない:

parent.male_children.build(name: 'Carl') 

は動作するはずです。

+0

実際のコードでは、クラスは男性/女性の子供ではありません。親子関係でトラブルを説明しようとしました。 実際のコードのサブクラスが異なる動作をするため、Male/Femaleの子クラスに異なる動作があるとすればうれしいです。 – tacamula

関連する問題