我想知道如何为模型添加关联。假设,我生成了两个模型
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表?我打算在我的代码中使用该表。
答案 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