Rails问题:有STI的belongs_to - 我该如何正确地做到这一点?

时间:2011-09-17 18:55:55

标签: ruby-on-rails ruby-on-rails-3 has-many single-table-inheritance sti

我一直在玩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文档似乎没有达到它的目的 或者我错过了(这完全可能)。
  4. 我的第一个想法是将parental_id添加到babies以及执行以下操作的Baby#owner方法:

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

    谢谢!

2 个答案:

答案 0 :(得分:6)

Baby同时属于MotherFather

belongs_to :mother
belongs_to :father

您可以拥有多个外键。然后Baby数据库表有两个字段mother_idfather_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,因为外键只能指向另一个记录,这意味着婴儿只有一个父母(当他们真的有两个时)。

似乎,在这种情况下,你只是误解了这种关系,就是这样。你走在正确的轨道上。

答案 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. :-)