rake db:migrate
在sqlite3
本地工作,但在heroku的postgresql
中不起作用。
错误
PG::UndefinedTable: ERROR: relation "musicians" does not exist
: ALTER TABLE "orders" ADD CONSTRAINT "fk_rails_ad134589be"
FOREIGN KEY ("musician_id")
REFERENCES "musicians" ("id")
(0.9ms) ROLLBACK
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UndefinedTable: ERROR: relation "musicians" does not exist
: ALTER TABLE "orders" ADD CONSTRAINT "fk_rails_ad134589be"
FOREIGN KEY ("musician_id")
以下是整个日志的链接:https://gist.github.com/helloravi/2cb69e0927e63e186b09
以下是未执行的迁移。该错误显示在迁移代码
下方class CreateAlbums < ActiveRecord::Migration
def change
create_table :albums do |t|
t.string :album_name
t.references :musician, index: true, foreign_key: true
t.timestamps null: false
end
add_foreign_key :albums, :users, column: :musician_id
end
end
我有一个带有音乐家列的用户表,该列是布尔值(有些用户是音乐家)
我甚至尝试使用add_foreign_key
,但我仍然无法弄清问题是什么。
我尝试了rake db:schema:load
并且有效。我希望能够使rake db:migrate
工作,因为我需要能够在生产中进行迁移。
答案 0 :(得分:3)
SQLite不检查外键,只是忽略它们。但PostgreSQL非常严格,并且当外键约束无效时会引发错误。
Rails foreign_key不支持您希望它执行的操作。当您编写t.references :musician
时,必须有一个musicians
表。但是您希望外键指向users
表。
我看到两个选项:
使用t.references :users
并在albums.rb
中重命名该关联,如下所示:
belongs_to :musician, class_name: 'User', foreign_key: 'user_id'
或者:您只需使用t.integer :musician_id
代替references
,并使用execute 'ALTER TABLE ...'
手动定义外键约束
答案 1 :(得分:1)
@spickermann所说的是正确的。 将迁移更改为以下内容应该有效:
class CreateAlbums < ActiveRecord::Migration
def change
create_table :albums do |t|
t.string :album_name
t.integer :musician_id
t.timestamps null: false
end
add_foreign_key :albums, :users, column: :musician_id
add_index :albums, :musician_id
end
end