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表添加一列,并且还将标记要编入索引的列.
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列.
生成迁移以创建关联:
rails g migration AddUserIdToCars user_id:integer
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45043 次 |
| 最近记录: |