Ruby on rails 添加\u外键\u不创建外键
Im使用Rails 5.1和SQLite。下面的迁移未按预期工作Ruby on rails 添加\u外键\u不创建外键,ruby-on-rails,sqlite,ruby-on-rails-5,Ruby On Rails,Sqlite,Ruby On Rails 5,Im使用Rails 5.1和SQLite。下面的迁移未按预期工作 class AddJobTitleForeignKeyToTimeOffTypes < ActiveRecord::Migration[5.1] def change add_column :time_off_types, :job_title_id, :integer add_foreign_key :time_off_types, :job_title, :column => :job_titl
class AddJobTitleForeignKeyToTimeOffTypes < ActiveRecord::Migration[5.1]
def change
add_column :time_off_types, :job_title_id, :integer
add_foreign_key :time_off_types, :job_title, :column => :job_title_id
end
end
class AddJobTitleForeignKeyToTimeOffTypes:作业\u标题\u id
结束
结束
它在表“time\u off\u types”中创建列“job\u title\u id”,但不创建外键。ActiveRecord的
add\u foreign\u key
方法在表创建之外使用,因此使用ALTER table。。。添加约束…
SQLite不支持添加约束(任何类型)。(值得一看,因为SQLite中的ALTER TABLE
可能比您预期的要有限。例如,SQLite<3.25.0
也不能重命名列。)
但是,SQLiteCREATE TABLE
不支持外键约束,ActiveRecord迁移CREATE_TABLE
\references方法可以创建它们:
def change
create_table :pets do
t.references :owner, foreign_key: true
...
end
end
《Rails迁移指南》没有提到这一区别
那么这是如何工作的呢
ActiveRecord数据库适配器有两种方法:支持\u外键?
和支持\u create?
中的\u外键,默认情况下这两种方法都是false
(请参阅Rails API文档)
添加外键
除非支持外键
为真
,但对于SQLite为假
,因此添加外键
的跟踪结束
另一方面,对于SQLite>=3.6.19
,它允许#references
方法使用create TABLE…
创建外键
(我已经链接到Rails 5.1代码,因为这是您在提问时使用的代码,但到今天的Rails 5.2.1,这一切都是正确的。)
job\u title\u id
是这里的外键add_foreign_key
将在time_off_types
表中的job_title_id
列与数据库级别的'job_titles'表的id列之间创建外键映射。这是一篇有用的博客文章topic@KarthikRavichandran你所解释的正是我想要它做的,但我做错了什么?第一栏是做什么的?只需做第二行:add\u foreign\u key:time\u off\u type,:job\u titles
hmm。。。我正在使用ActiveRecord 5.2和sqlite 3.27.2,它似乎没有在SQL模式中添加外键约束,也没有反映在schema.rb中<代码>支持外键?返回false
和在创建中支持外键
返回true
。但是,即使我在create_table
中使用t.references
,它似乎没有为表生成正确的SQL…结果是,sqlite3
适配器中有一个错误,当表被更改时,它将丢失外键:看起来是一个修复,但我认为它是针对v6的。