13

我一直在玩弄 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
  1. 应该Baby属于什么?
  2. 在迁移方面,我应该为babies表上的外键命名/添加什么?
  3. 我很难研究这个,是否有明确的来源可以解释这一点?API 文档似乎没有击中它,或者我错过了它(这是完全可能的)。

我的第一个想法是添加一个parental_id类似babies的方法Baby#owner,执行以下操作:

  • 击中self.parental
  • 确定父母的类型
  • 返回正确的父母类型(可能是母亲,也可能是父亲)

谢谢!

4

2 回答 2

9

Baby属于两者MotherFather

belongs_to :mother
belongs_to :father

您可以有多个外键。然后BabyDB 表有两个字段,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.motherbaby.father. 你不能有一个parental_id,因为外键只能指向另一个记录,这意味着婴儿只有一个父母(实际上他们有两个)。

似乎,在这种情况下,你只是误解了这种关系,仅此而已。你在正确的轨道上。

于 2011-09-17T19:00:56.567 回答
3

我自己通过添加明确的 foreign_key 调用解决了类似的问题。

类似于以下代码:

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

当然,这是假设一个婴儿只有一个父母。:-)

于 2016-08-31T18:18:58.840 回答