我不同意neongrau。您不需要第二张桌子来实现这一点。可以通过在您的狗表中进行动态自连接来完成。您将首先在单个模型中声明所有关系,并分别声明它们的外键:
models/dog.rb:
class Dog < ActiveRecord::Base
belongs_to :mom, class_name: "Dog", foreign_key: "mom_id"
belongs_to :dad, class_name: "Dog", foreign_key: "dad_id"
has_many :kids, class_name: "Dog"
end
然后您将运行引用妈妈和爸爸的迁移:
class CreateDogs < ActiveRecord::Migration
def change
create_table :dogs do |t|
t.string :name
t.integer :age
t.references :mom
t.references :dad
t.integer :dog_id
t.timestamps null: false
end
end
现在我们通过手动建立关联来测试它:
kid = Dog.create(name: "Rover")
=> #<Dog id: 8, name: "Rover"..>
ma = Dog.create(name: "Susie")
=> #<Dog id: 2, name: "Susie"..>
pa = Dog.create(name: "Doug")
=> #<Dog id: 8, name: "Doug"..>
kid.mom_id = 2
kid.save
kid.mom
=> #<Dog id: 2, name: "Susie"...>
kid.dad_id = 3
kid.save
kid.dad
=> #<Dog id: 3, name: "Doug"...>
ma.kids << kid
ma.save
ma.kids
=> #<Dog id: 1, name: "Rover"...>
pa.kids << kid
pa.save
pa.kids
=> #<Dog id: 1, name: "Rover"...>
现在你有一个动态的关系,狗可以有多个孩子,并且可能属于母亲和父亲。