(Rails是5.0.0版,Ruby 2.3.0p0)
我想在Users表和Cards表之间创建一个关联。我已将belongs_to :user
添加到Cards模型,并将has_many :cards
添加到Users模型,并创建了一个迁移:
class AddUserIdToCard < ActiveRecord::Migration[5.0]
def change
add_foreign_key :cards, :users, column: :user_id
end
end
当我运行rake db:migrate
时,我收到错误:
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "user_id" referenced in foreign key constraint does not exist
: ALTER TABLE "cards" ADD CONSTRAINT "fk_rails_8ef7749967"
FOREIGN KEY ("user_id")
REFERENCES "users" ("id")
现在我最初只是通过在迁移中添加add_column :cards, :user_id, :integer
来解决这个问题,但这看起来并不是很整洁,我担心以后出现的问题。有没有更好的方法来实现这一目标?
您正在使用列cards
为user_id
表设置外键。但是你还没有创建引用。创建引用,然后添加外键以维护引用完整性。使用回滚并修改您的迁移
1 class AddUserIdToCard < ActiveRecord::Migration[5.0]
2 def change
3 add_reference :cards, :users, index:true
4 add_foreign_key :cards, :users
5 end
6 end
第3行将在cards
表中创建id
表中users
的引用(通过在user_id
中创建cards
列)。
第4行将在数据库级别向user_id
添加外键约束。
提供的答案对于Rails 5不准确。滚动到文档的add_reference位以获取更多信息,但在上述问题的情况下,您将使用:
class AddUserIdToCard < ActiveRecord::Migration[5.0]
def change
add_reference :cards, :users, foreign_key: true
end
end
class AddUserIdToCard < ActiveRecord::Migration[5.2]
def change
add_foreign_key :cards, :users, column: :user_id, primary_key: :"id", on_delete: :cascade
end
end
尝试此迁移。我遇到了同样的问题然后我修复了它。