将 Ruby on Rails 推送到 Heroku 时出现 SchemaError

SchemaError Pushing Ruby on Rails to Heroku

我正在尝试将我的应用程序推送到 Heroku,但遇到了 SchemaError。我不确定添加约束“FK_RAILS_8A77483D84”是什么意思。我的开发活动记录数据库似乎工作得很好。我在下面添加了错误、活动记录查询、我的 Schema.db 和 CreateMicroposts.rb 文件。

== 20141231063907 CreateMicroposts: migrating =================================
-- create_table(:microposts)
 (109.2ms)  CREATE TABLE "microposts" ("id" serial primary key, "content" text, "user_id"        integer, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL) 
 (50.1ms)  CREATE  INDEX  "index_microposts_on_user_id" ON "microposts"  ("user_id")
 -> 0.1634s
-- add_foreign_key(:microposts, [:user_id, :created_at])
(4.2ms)  ALTER TABLE "microposts" ADD CONSTRAINT "fk_rails_9d9d4880ea"
FOREIGN KEY ("[:user_id, :created_at]_id")
REFERENCES "[:user_id,".":created_at]" ("id")

PG::InvalidSchemaName: ERROR:  schema "[:user_id," does not exist
: ALTER TABLE "microposts" ADD CONSTRAINT "fk_rails_9d9d4880ea"
FOREIGN KEY ("[:user_id, :created_at]_id")
REFERENCES "[:user_id,".":created_at]" ("id")

Active Record 查询,附加了 user_id。

2.1.4 :001 > Micropost.first
 Micropost Load (2.5ms)  SELECT  "microposts".* FROM "microposts"  ORDER BY                        "microposts"."created_at" DESC LIMIT 1
 => #<Micropost id: 303, content: "Sewer", user_id: 1, created_at: "2015-01-01 00:56:34", updated_at: "2015-01-01 00:56:34", picture: "IMG_7206.jpg"> 
2.1.4 :002 > User.first
  User Load (0.1ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
 => #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2014-12-31 07:28:36", updated_at: "2014-12-31 07:28:36", password_digest: "a$uVp2u1r6wiWc0f6Gqwx5BOdKjt6a165cbb82VrunsSI...", remember_digest: nil, admin: true, activation_digest: "a$waWyAykqx2QbYdWG0wPEMen5elWR62Rxw94Lpcfx73S...", activated: true, activated_at: "2014-12-31 07:28:36", reset_digest: nil, reset_sent_at: nil> 

Schema.rb

ActiveRecord::Schema.define(version: 20150101001952) do

create_table "microposts", force: true do |t|
 t.text     "content"
 t.integer  "user_id"
 t.datetime "created_at", null: false
 t.datetime "updated_at", null: false
 t.string   "picture"
end

add_index "microposts", ["user_id"], name: "index_microposts_on_user_id"

create_table "users", force: true do |t|
 t.string   "name"
 t.string   "email"
 t.datetime "created_at",                        null: false
 t.datetime "updated_at",                        null: false
 t.string   "password_digest"
 t.string   "remember_digest"
 t.boolean  "admin",             default: false
 t.string   "activation_digest"
 t.boolean  "activated",         default: false
 t.datetime "activated_at"
 t.string   "reset_digest"
 t.datetime "reset_sent_at"
end

add_index "users", ["email"], name: "index_users_on_email", unique: true

end

微博

class CreateMicroposts < ActiveRecord::Migration
  def change
    create_table :microposts do |t|
     t.text :content
     t.references :user, index: true
     t.timestamps null: false
   end
  add_foreign_key :microposts, [:user_id, :created_at]
 end
end

看起来你只是错误地使用了 add_foreign_keyforeigner is assuming that you know what you're doing. The docs say that add_foreign_key 是这样使用的:

add_foreign_key(from_table, to_table, options)

如果我们将其与您的迁移进行比较:

add_foreign_key :microposts, [:user_id, :created_at]

我们看到 from_table:micropoststo_table 是数组 [:user_id, :created_at]。如果你在那个数组上调用 to_s,你会得到看起来很奇怪的混乱,最终是 SQL:

ALTER TABLE "microposts" ADD CONSTRAINT "fk_rails_9d9d4880ea"
FOREIGN KEY ("[:user_id, :created_at]_id")
--            ^^^^^^^^^^^^^^^^^^^^^^^
REFERENCES "[:user_id,".":created_at]" ("id")
--         ^^^^^^^^^^^^^^^^^^^^^^^^^^^

大概您只想将 microposts.user_id 作为引用 users.id 的 FK。这意味着您想说:

add_foreign_key :microposts, :users

老外应该自己弄清楚引用列和名称以及引用的table名称。