关于ActiveRecord关联和外键的混淆

时间:2013-09-15 23:51:25

标签: ruby-on-rails ruby activerecord

在下面的示例中,我是否必须在Office模型中创建employee_id,还是由db:migrate自动创建?

class Employee < ActiveRecord::Base
  has_one :office
end

class Office < ActiveRecord::Base
  belongs_to :employee    # foreign key - employee_id
end

感觉我错过了一些基本的东西。我试图让一个基本的一对多关系工作,我可以从一侧使用下拉选择对象。是否有任何良好的基本技巧解释这是如何工作的?

我必须在我希望它能够工作的所有模型中创建_id,但从我看过的例子来看,它似乎没有。

2 个答案:

答案 0 :(得分:2)

ActiveRecord中的关联包括两部分。将模型对象连接在一起(就像你已经完成的那样)并设置数据库。因此,您需要在迁移中定义关联,如下所示:

def change
  create_table :offices do |t|
    # Other migrations

    t.references :employee
  end
end

或者你也可以做t.integer :employee_id,这也会达到同样的目的。

答案 1 :(得分:2)

两个步骤。

首先,您必须在迁移文件的office表中创建employee_id字段。你会有类似的东西:

class CreateOffices < ActiveRecord::Migration
  def change
    create_table :offices do |t|
      t.string :name
      t.integer :employee_id

      t.timestamps
    end
  end
end

其次,您必须在模型中定义关联。按照惯例,如果将foreign_key字段命名为employee_id,则不必在模型中指定它的名称。

class Office < ActiveRecord::Base
  belongs_to :employee
end

应该足够了。