将 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_key
而 foreigner 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
是 :microposts
而 to_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名称。
我正在尝试将我的应用程序推送到 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_key
而 foreigner 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
是 :microposts
而 to_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名称。