61

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

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

4 回答 4

80

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

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

rails g model car user_id:references

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

rails g migration add_user_id_to_cars user_id:integer

然后在生成的迁移中,添加

add_index :cars, :user_id

更新:

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

bin/rails g migration add_user_to_cars user:references

将创建一个迁移,其行类似于

add_reference :cars, :user, index: true

这将向汽车表中添加一user_id列,并且还将标记该列以进行索引。

于 2013-03-13T12:33:11.517 回答
21

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

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 列。

于 2014-06-06T14:35:24.037 回答
9

生成迁移以创建关联:

rails g migration AddUserIdToCars user_id:integer
rake db:migrate
于 2013-03-13T12:19:37.667 回答
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
于 2017-07-25T13:02:18.607 回答