aと aをFamily
含むクラスがあります。家族モデルの観点からは、どちらの親が母親でどちらが父親であるかを知ることが重要ですが、母親と父親はすべて同じ属性 (データベース列など) を持っています。理想的には、モデル ファイルを次のようにしたいと考えています。mother_id
father_id
Residents
class Resident < ActiveRecord::Base
has_one :family, :dependent => :nullify, :foreign_key => :father_id
has_one :family, :dependent => :nullify, :foreign_key => :mother_id
attr_accessible :email, :cell, :first_name, :last_name
end
class Family < ActiveRecord::Base
belongs_to :father, :class_name => 'Resident', :foreign_key => 'father_id'
belongs_to :mother, :class_name => 'Resident', :foreign_key => 'mother_id'
attr_accessible :address, :city, :state, :number_of_children
end
これはうまくいきません。 my_family.mother
とmy_family.father
動作するので、Rails は double に満足しているようbelongs_to
です。ただし、は、2 番目が 1 番目をオーバーライドしてmy_dad.family == nil
いることを示しています。has_one
そうしないと、resident_id が Mother_id 列と Father_id 列の両方に表示されるとどうなるでしょうか。(モデルレベルの検証を追加して、決して起こらないようにする予定ですが、has_one
検証メソッドとは話しません。)さらに、どういうmy_dad.family = Family.new
意味ですか?ActiveRecord は、またはに挿入my_dad.id
するかどうかをどのように選択しますか?Family.mother_id
Family.father_id
この Stackoverflow questionから、別の名前を使用するというアイデアを得ました。つまり、has_one
行を次のように変更します。
has_one :wife_and_kids, :class_name => 'Family', :dependent => :nullify, :foreign_key => :father_id
has_one :husband_and_kids, :class_name => 'Family', :dependent => :nullify, :foreign_key => :mother_id
私の質問は次のとおりです。
1) より良い方法はありますか? おそらく別のDBスキーマですか?
2) データベース レベルの検証でモデル レベルの検証を補完して、列と列my_dad.id
の両方に表示されないようにすることは可能ですか?mother_id
father_id
husband_and_kids
3) /よりも良い名前を考えられますwife_and_kids
か? (確かにプログラミングの質問ではありません...)
編集: 家族のゲッターを追加することが私に起こりました:
def family
@family ||= self.wife_and_kids || self.husband_and_kids
end
after_save :reset_family
def reset_family
@family = nil
end
[husband|wife]_and_kids
これにより、セッターがないためあいまいさを生み出すことなく、構文的にきれいになります (私は本当に のファンではなかったので)。