我一直在玩STI和belongs_to / has_many关系,我有点困惑。
基于类似于以下的模型配置,我有几个问题:
class Parental < ActiveRecord::Base
end
class Mother < Parental
has_many :babies
end
class Father < Parental
has_many :babies
end
class Baby < ActiveRecord::Base
belongs_to :??????
end
Baby
应该属于哪个?babies
表?我的第一个想法是将parental_id
添加到babies
以及执行以下操作的Baby#owner
方法:
谢谢!
答案 0 :(得分:6)
Baby
同时属于Mother
和Father
belongs_to :mother
belongs_to :father
您可以拥有多个外键。然后Baby
数据库表有两个字段mother_id
和father_id
关联的权威指南在这里:http://guides.rubyonrails.org/association_basics.html
创建Baby
类的迁移看起来像这样:
class CreateBabies < ActiveRecord::Migration
def self.up
create_table :babies do |t|
t.integer :father_id
t.integer :mother_id
end
end
def self.down
drop_table :babies
end
end
这给你的东西:
baby.mother
和baby.father
。你不能只有一个parental_id
,因为外键只能指向另一个记录,这意味着婴儿只有一个父母(当他们真的有两个时)。
似乎,在这种情况下,你只是误解了这种关系,就是这样。你走在正确的轨道上。
答案 1 :(得分:2)
I've solved a similar problem myself by adding an explicit foreign_key call.
Something like the following code:
class Parental < ActiveRecord::Base
end
class Mother < Parental
has_many :babies
end
class Father < Parental
has_many :babies
end
class Baby < ActiveRecord::Base
belongs_to :mother, foreign_key: 'parental_id'
belongs_to :father, foreign_key: 'parental_id'
end
Of course, this assumes that a baby has only one parent. :-)