Pla*_*Ton 162 migration activerecord ruby-on-rails
如果我创建一个新的rails 3迁移(例如)
rails g migration tester title:tester user:references
Run Code Online (Sandbox Code Playgroud)
,一切正常......但是,如果我添加一个包含以下内容的列:
rails g migration add_user_to_tester user:references
Run Code Online (Sandbox Code Playgroud)
参考字段无法识别.简而言之,问题是:如何从命令行向rails迁移添加引用列?
Pau*_*lgo 205
如果您使用的是Rails 4.x,现在可以使用引用生成迁移,如下所示:
rails generate migration AddUserRefToProducts user:references
Run Code Online (Sandbox Code Playgroud)
就像你可以在导轨上看到的那样
Dan*_*nne 186
编辑:这是一个过时的答案,不应该应用于Rails 4.x +
如果可以对引用的类使用整数id,则无需添加引用.
我说使用引用而不是普通整数的优点是模型将使用belongs_to预定义,并且由于模型已经创建,并且在迁移现有内容时不会受到影响,因此目的有点丢失.
所以我会这样做:
rails g migration add_user_id_to_tester user_id:integer
Run Code Online (Sandbox Code Playgroud)
然后在Tester模型中手动添加belongs_to:user
Eug*_*ene 102
请注意,您很可能也需要该列的索引.
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
add_index :testers, :user_id
end
end
Run Code Online (Sandbox Code Playgroud)
小智 50
通过上面提到的前两个步骤,您仍然缺少外键约束.这应该工作:
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer, references: :users
end
end
Run Code Online (Sandbox Code Playgroud)
gl0*_*l03 35
您可以在更改迁移中使用引用.这是有效的Rails 3.2.13代码:
class AddUserToTester < ActiveRecord::Migration
def change
change_table :testers do |t|
t.references :user, index: true
end
end
def down
change_table :testers do |t|
t.remove :user_id
end
end
end
Run Code Online (Sandbox Code Playgroud)
cf:http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
Wir*_*ing 27
运行rails g migration AddUserRefToSponsors user:references将生成以下迁移:
def change
add_reference :sponsors, :user, index: true
end
Run Code Online (Sandbox Code Playgroud)
添加列时,需要将该列设为整数,如果可能,请使用rails约定.因此,对于您的情况,我假设您已经拥有测试人员和用户模型,以及测试人员和用户表.
要添加外键,需要创建名为user_id(约定)的整数列:
add_column :tester, :user_id, :integer
Run Code Online (Sandbox Code Playgroud)
然后将belongs_to添加到测试器模型:
class Tester < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
您可能还想为外键添加索引(这是引用已经为您做的事情):
add_index :tester, :user_id
Run Code Online (Sandbox Code Playgroud)
这样就可以了:
rails g migration add_user_to_tester user_id:integer:index
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113322 次 |
| 最近记录: |