Rails:在生产

时间:2017-12-09 11:15:07

标签: ruby-on-rails postgresql

我在迁移中创建了两个引用,这些引用是对我的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,但我得到了同样的错误。

知道这里有什么问题吗?

3 个答案:

答案 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