Ruby on rails Heroku迁移失败不可定义错误

Ruby on rails Heroku迁移失败不可定义错误,ruby-on-rails,postgresql,heroku,rails-activerecord,rails-migrations,Ruby On Rails,Postgresql,Heroku,Rails Activerecord,Rails Migrations,我在开发和测试中使用sqlite,并部署到Heroku,Heroku在生产中使用Postgres。通过在终端中运行以下命令,我创建了一个新的“评论”模型: rails g model Review comment:text star:integer room:references reservation:references guest:references host:references type rails g model GuestReview --parent=Review --migr

我在开发和测试中使用sqlite,并部署到Heroku,Heroku在生产中使用Postgres。通过在终端中运行以下命令,我创建了一个新的“评论”模型:

rails g model Review comment:text star:integer room:references reservation:references guest:references host:references type
rails g model GuestReview --parent=Review --migration=false
rails g model HostReview --parent=Review --migration=false
rails db:migrate
这是上述命令的输出:

$ rails g model Review comment:text star:integer room:references reservation:references guest:references host:references type
Running via Spring preloader in process 6862
  invoke  active_record
  create    db/migrate/20180613031058_create_reviews.rb
  create    app/models/review.rb
  invoke    test_unit
  create      test/models/review_test.rb
  create      test/fixtures/reviews.yml

$ rails g model GuestReview --parent=Review --migration=false
Running via Spring preloader in process 6872
  invoke  active_record
  create    app/models/guest_review.rb
  invoke    test_unit
  create      test/models/guest_review_test.rb
  create      test/fixtures/guest_reviews.yml

$ rails g model HostReview --parent=Review --migration=false
Running via Spring preloader in process 6880
  invoke  active_record
  create    app/models/host_review.rb
  invoke    test_unit
  create      test/models/host_review_test.rb
  create      test/fixtures/host_reviews.yml

$ rails db:migrate
== 20180613031058 CreateReviews: migrating 
====================================
-- create_table(:reviews)
-> 0.0806s
== 20180613031058 CreateReviews: migrated (0.0828s) 
===========================
该网站在localhost上正常运行,当我在sqlite中检查数据时,我能够正确保存评论。当我部署到Heroku并运行

heroku run rake db:migrate 
我得到以下错误:

rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "guests" does not exist
: CREATE TABLE "reviews" ("id" serial primary key, "comment" text, 
"star" integer DEFAULT 1, "room_id" integer, "reservation_id" integer, 
"guest_id" integer, "host_id" integer, "type" character varying, 
"created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, 
CONSTRAINT "fk_rails_b98b7304fe"
FOREIGN KEY ("room_id")
  REFERENCES "rooms" ("id")
, CONSTRAINT "fk_rails_628a43e51f"
FOREIGN KEY ("reservation_id")
  REFERENCES "reservations" ("id")
, CONSTRAINT "fk_rails_eaa1ce2871"
FOREIGN KEY ("guest_id")
  REFERENCES "guests" ("id")
, CONSTRAINT "fk_rails_ac5cb4d097"
FOREIGN KEY ("host_id")
  REFERENCES "hosts" ("id")
)
以下是供审阅的迁移文件:

class CreateReviews < ActiveRecord::Migration[5.0]
  def change
    create_table :reviews do |t|
      t.text :comment
      t.integer :star, default: 1
      t.references :room, foreign_key: true
      t.references :reservation, foreign_key: true
      t.references :guest, foreign_key: true
      t.references :host, foreign_key: true
      t.string :type

      t.timestamps
    end
  end
end
class CreateReviews
以下是审查模式:

class Review < ApplicationRecord
end
class GuestReview < Review
  belongs_to :guest, class_name: "User"
end
class HostReview < Review
  belongs_to :host, class_name: "User"
end
class Review
以下是guest_审查模型:

class Review < ApplicationRecord
end
class GuestReview < Review
  belongs_to :guest, class_name: "User"
end
class HostReview < Review
  belongs_to :host, class_name: "User"
end
class GuestReview
以下是host_审查模型:

class Review < ApplicationRecord
end
class GuestReview < Review
  belongs_to :guest, class_name: "User"
end
class HostReview < Review
  belongs_to :host, class_name: "User"
end
class HostReview

似乎在Heroku Postgres上,它正在寻找一张不存在的客人桌。是否有办法解决此错误,使其在我的开发环境和Heroku中正常运行?

在迁移中,
t.references:guest,foreign\u key:true
做两件事:

  • 它创建一个名为
    guest\u id
    的整数列(或
    bigint
    ,具体取决于Rails版本)
  • 它在数据库内部将一个外键约束从
    guest\u id
    列添加到
    guests
    表中的
    id
  • 但是您试图引用的表是
    用户
    (即
    用户
    模型),而不是
    来宾
    。由于名称不匹配,您必须调整调用以告知ActiveRecord要引用哪个表:

    t.references :guest, foreign_key: { to_table: :users }
    
    类似地,对于无法推断表名的任何其他
    t.references
    调用



    一旦解决了眼前的问题,就应该在开发环境中安装PostgreSQL,以便在同一个堆栈上进行开发、测试和部署。除了最简单和最琐碎的事情外,ActiveRecord无法提供数据库可移植性,因此使用不同的数据库进行开发和部署会带来灾难。

    在迁移中,
    t.references:guest,foreign\u key:true
    做两件事:

  • 它创建一个名为
    guest\u id
    的整数列(或
    bigint
    ,具体取决于Rails版本)
  • 它在数据库内部将一个外键约束从
    guest\u id
    列添加到
    guests
    表中的
    id
  • 但是您试图引用的表是
    用户
    (即
    用户
    模型),而不是
    来宾
    。由于名称不匹配,您必须调整调用以告知ActiveRecord要引用哪个表:

    t.references :guest, foreign_key: { to_table: :users }
    
    类似地,对于无法推断表名的任何其他
    t.references
    调用



    一旦解决了眼前的问题,就应该在开发环境中安装PostgreSQL,以便在同一个堆栈上进行开发、测试和部署。除了最简单和最琐碎的事情外,ActiveRecord不提供数据库可移植性,因此使用不同的数据库进行开发和部署会导致灾难。

    您有用户表吗?看起来您正在尝试引用它。是的,有一个用户表。我尝试了您建议的更改,但在运行heroku run rake db:migrate:PG::UndefinedTable:error:relation“guest_reviews”不存在时出现了相同的错误。您正在引用用户表以获取ID。我用我认为可以解决您问题的方法更新了我的答案。您有用户表吗?看起来您正在尝试引用它。是的,有一个用户表。我尝试了您建议的更改,但在运行heroku run rake db:migrate:PG::UndefinedTable:error:relation“guest_reviews”不存在时出现了相同的错误。您正在引用用户表以获取ID。我用我认为可以解决您问题的方法更新了我的答案。