我在迁移中创建了两个引用,这些引用是对我的User表的引用的别名:
class CreateInvitations < ActiveRecord::Migration[5.0]
def change
create_table :invitations do |t|
t.references :owner, references: :user, foreign_key: true # the owner
t.references :invitee, references: :user, foreign_key: true # the invitee
t.references :core_bot, foreign_key: true # the associated page (core_bot_active)
t.string :email
t.string :token
t.timestamps
end
end
end
在我的用户模型中:
has_many :invitations, foreign_key: :owner_id
has_many :invitations, foreign_key: :invitee_id, dependent: :destroy
在我的邀请模型中:
belongs_to :owner, class_name: :User
belongs_to :invitee, class_name: :User
在开发过程中一切运行良好但是当我尝试使用Heroku heroku run rake db:migrate
进行生产迁移时,我收到以下错误:
PG :: UndefinedTable:错误:关系“所有者”不存在:CREATE 表“邀请”(“id”串行主键,“owner_id”整数, “invitee_id”整数,“core_bot_id”整数,“电子邮件”字符 变化,“令牌”字符变化,“created_at”时间戳NOT NULL, “updated_at”时间戳NOT NULL,CONSTRAINT“fk_rails_59e24979a9” FOREIGN KEY(“owner_id”)REFERENCES“owner”(“id”),CONSTRAINT “fk_rails_00204dc74b”FOREIGN KEY(“invitee_id”)参考 “被邀请者”(“id”),CONSTRAINT“fk_rails_34505bdb65”外键 (“core_bot_id”)REFERENCES“core_bots”(“id”))
我试过没有references: :user
,但我得到了同样的错误。
知道这里有什么问题吗?
答案 0 :(得分:5)
您的开发可能是一个sqLite数据库,但Heroku使用PostgreSQL,迁移的解释正在生成owners
的预测密钥
改为写下这样的迁移......
class CreateInvitations < ActiveRecord::Migration[5.0]
def change
create_table :invitations do |t|
t.references :owner, index: true # the owner
t.references :invitee, index: true # the invitee
t.references :core_bot, foreign_key: true # the associated page (core_bot_active)
t.string :email
t.string :token
t.timestamps
end
add_foreign_key :invitations, :users, column: :owner_id
add_foreign_key :invitations, :users, column: :invitee_id
end
end
使用与生产实施不同的数据库产品开发风险是其中一个风险。迁移可能无法完全相同。如果计划部署到Heroku,你应该考虑在开发中使用postgreSQL。
答案 1 :(得分:1)
我不知道如何解决你的问题。但是我总是用这样的外键为Postgres DB创建迁移:
def change
create_table :invitations do |t|
t.integer :owner_id
t.integer :invitee_id
t.references :core_bot, foreign_key: true # the associated page (core_bot_active)
t.string :email
t.string :token
t.timestamps
end
add_index :invitations, :owner_id
add_foreign_key :invitations, :users, column: :owner_id
add_index :invitations, :invitee_id
add_foreign_key :invitations, :users, column: :invitee_id
end
答案 2 :(得分:-1)
尝试从选项中删除foreign_key:true,因为我们给它一个引用,我认为我们不需要foreign_key:true选项
class CreateInvitations < ActiveRecord::Migration[5.0]
def change
create_table :invitations do |t|
t.references :owner, # the owner
t.references :invitee, # the invitee
t.references :core_bot # the associated page (core_bot_active)
t.string :email
t.string :token
t.timestamps
end
end
end