我有一个Family
包含 amother_id
和 a的课程father_id
。从Family 模型的角度来看,重要的是要知道哪个父母是母亲,哪个是父亲,但是母亲和父亲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
。但是,my_dad.family == nil
表示第二个has_one
覆盖第一个。这是合理的,因为否则,如果 resident_id 同时出现在 mother_id 和父亲 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)有更好的方法吗?也许是不同的数据库模式?
2) 数据库级验证是否可以补充模型级验证以确保my_dad.id
不能同时出现在mother_id
和father_id
列中?
3) 你能想出比husband_and_kids
/更好的名字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
),因为没有设置器,所以不会产生任何歧义。