添加与现有模型的关联

And*_*rew 50 migration ruby-on-rails associations

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

rails generate model User
rails generate model Car
Run Code Online (Sandbox Code Playgroud)

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

class User < ActiveRecord::Base
  has_many :cars
end
class Car < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

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

jvn*_*ill 71

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

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

rails g model car user_id:references
Run Code Online (Sandbox Code Playgroud)

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

rails g migration add_user_id_to_cars user_id:integer
Run Code Online (Sandbox Code Playgroud)

然后在生成的迁移中添加

add_index :cars, :user_id
Run Code Online (Sandbox Code Playgroud)

更新:

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

bin/rails g migration add_user_to_cars user:references
Run Code Online (Sandbox Code Playgroud)

将使用类似于的行创建迁移

add_reference :cars, :user, index: true
Run Code Online (Sandbox Code Playgroud)

这将向user_idcars表添加一列,并且还将标记要编入索引的列.

  • 您.habtm连接表不需要类但仍然需要表,你需要为它创建一个迁移:) (3认同)
  • 您可以在创建模型后添加引用,而不是分两步执行此操作,如下所示:`rails g migration addUserReferencesToCars user:references`.这需要将`user_id`添加到`cars`并使其成为一次索引. (2认同)

Sim*_*onW 19

按照@jvnill在rails 4中的解释(也可能在rails 3.2中)你可以这样做(避免id部分并记住精确的对流):

rails g migration AddUserToCar user:references
Run Code Online (Sandbox Code Playgroud)

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

class AddUserToCar < ActiveRecord::Migration
  def change
    add_reference :cars, :user, index: true
  end
end
Run Code Online (Sandbox Code Playgroud)

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

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*own 7

生成迁移以创建关联:

rails g migration AddUserIdToCars user_id:integer
rake db:migrate
Run Code Online (Sandbox Code Playgroud)