Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 添加\u外键\u不创建外键_Ruby On Rails_Sqlite_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 添加\u外键\u不创建外键

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

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_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
也不能重命名列。)

但是,SQLite
CREATE 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的。