rake db:migratesqlite3中本地工作,但在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 ...'手动定义外键约束。

10-08 04:26