rails中的迁移(sqlite)

时间:2011-02-23 13:05:30

标签: ruby-on-rails migration sqlite

嘿我的rake

有一个小问题
class CreateEvents < ActiveRecord::Migration

  def self.up
    create_table :events do |t|
      t.integer :broadcast_id
      t.integer :position
      t.string :title
      t.string :location
      t.string :link
      t.text :description
      t.datetime :time
  end
    add_foreign_key :events, :broadcast_id, :broadcasts
  end

  def self.down
    remove_foreign_key :events, :broadcast_id, :broadcasts
    drop_table :events
  end

end

问题=&gt; add_foreign_key:events,:broadcast_id,:broadcasts

$ rake db:migrate

== CreateEvents: migrating ===================================================
-- create_table(:events)
-> 0.0021s
-- add_index(:events, :broadcast_id)
-> 0.0004s
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: near "FOREIGN": syntax error: ALTER TABLE "events" ADD FOREIGN KEY ("broadcast_id") REFERENCES "broadcasts"(id)

2 个答案:

答案 0 :(得分:3)

为什么用这种方式定义外键?

如果您想要EventsBroadcasts之间的关系,那么您应该考虑创建一个有效的记录关系。像

这样的东西
# Event model
class Event < ActiveRecord::Base
  belongs_to :broadcast
end

# Broadcast model
class Broadcast < ActiveRecord::Base
  has_many :events
end

这样你就可以让rails为你维护外键关系。查看有关活动记录关联的Rails Guide以获取更多信息。

答案 1 :(得分:1)

从版本3.6.19开始,SQLite(也称为默认开发数据库)支持外键约束,但外键约束的强制执行turned off by default(为了向后兼容),要修复它:
建议选项

使用其他数据库(如mysql / postgresql)作为开发     Rails中的数据库,下面是一个例子:

  

默认值:&amp;默认
  适配器:mysql2
  编码:utf8
  游泳池:5
  用户名:user
  密码:密码
  socket:/tmp/mysql.sock

     

发展:
  &lt;&lt ;: *共享
  database:db_development

其他选项包括

  1. SQLite的未来版本(4. *)有enabled foreign key constraints in default,但截至目前,尚未发布。
  2. 我们还可以通过以下命令启用外键支持:

    sqlite> PRAGMA foreign_keys = ON;
    sqlite> PRAGMA foreign_keys // should print 1

    但请注意:

    • 它不会持续存在,你必须在每个连接上都这样做;
    • 如果PRAGMA foreign_keys没有打印,则表示您的SQLite版本不支持外键,请升级到3.6.19或更高版本;
  3. 有人说我们可以在连接字符串中启用它,但我没有在Rails中找到正确的字符串。您可以参考this answer