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
工作,因为我需要能够在生产中迁移。 最佳答案
sqlite不检查外键,它只是忽略它们。但是postgresql非常严格,当外键约束无效时会引发错误。
railsforeign_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 ...'
手动定义外键约束。