添加与现有模型的关联

时间:2013-03-13 12:17:07

标签: ruby-on-rails migration associations

我想知道如何为模型添加关联。假设,我生成了两个模型

rails generate model User
rails generate model Car

现在我想添加一个关联,以便模型获取表单

class User < ActiveRecord::Base
  has_many :cars
end
class Car < ActiveRecord::Base
  belongs_to :user
end

问题是:如何通过迁移应用此修改以获取数据库中的cars_users表?我打算在我的代码中使用该表。

4 个答案:

答案 0 :(得分:71)

belongs_to关联期望其对应表中的association_id列。由于汽车属于用户,汽车表应该有user_id列。这可以通过两种方式实现。

首先,您可以在创建模型时生成列

rails g model car user_id:references

或者在创建像Richard Brown的答案之类的模型后添加user_id。请注意,如果您使用integer而不是references,则必须自己创建索引。

rails g migration add_user_id_to_cars user_id:integer

然后在生成的迁移中添加

add_index :cars, :user_id

更新:

正如Joseph在评论中提到的,在当前版本的Rails中已经解决了手动添加索引的需要。我认为它是在Rails 4中引入的。您可以在official Rails guide for migrations中阅读更多内容。它的要点是运行以下生成器

bin/rails g migration add_user_to_cars user:references

将使用类似于

的行创建迁移
add_reference :cars, :user, index: true

这会在cars表中添加user_id列,并且还会标记要编入索引的列。

答案 1 :(得分:19)

按照@ jvnill在 rails 4 (也可能在rails 3.2中)的解释,您也可以这样做(避免使用id部分并记住确切的对话):

rails g migration AddUserToCar user:references

这将创建以下迁移,同时使用所有正确的约定添加列和索引:

class AddUserToCar < ActiveRecord::Migration
  def change
    add_reference :cars, :user, index: true
  end
end

最后一如既往地进行迁移:

rake db:migrate

查看您的schema.rb以查看新索引和user_id列。

答案 2 :(得分:7)

生成迁移以创建关联:

rails g migration AddUserIdToCars user_id:integer
rake db:migrate

答案 3 :(得分:0)

迁移文件:

class Createuser < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
    end

    create_table :cars do |t|
      t.belongs_to :user, index: true
      t.varchar(255) :model
      t.varchar(255) :color
    end
  end
end