使用add_foreign_key进行Rails迁移:外键约束中引用的“column”user_id“不存在”

时间:2016-08-04 17:59:35

标签: ruby-on-rails ruby ruby-on-rails-5

(Rails是5.0.0版本,Ruby 2.3.0p0)

我想在Users表和Cards表之间创建一个关联。我已将belongs_to :user添加到卡片模型,并将has_many :cards添加到用户模型,并使用以下内容创建了迁移:

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来解决这个问题,但这看起来并不是很整洁,我担心以后会出现问题。有没有更好的方法来实现这一目标?

3 个答案:

答案 0 :(得分:3)

您正在使用列cardsuser_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添加外键约束。

如需了解更多信息,请阅读Add a reference column migration in Rails 4

答案 1 :(得分:0)

提供的答案对于Rails 5不准确。滚动到文档的add_reference位以获取更多信息,但在上述问题的情况下,您将使用:

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__) #flask app is created here
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:password@localhost/test'
db = SQLAlchemy(app) 

class Locatn(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    place = db.Column(db.String(20), unique=True)
    location = db.Column(db.String(20), unique=True)

    def __init__(self, place, location):
    self.place = place
    self.location = location

    def __repr__(self):
    return '<Locatn %r>' % self.place

答案 2 :(得分:0)

class AddUserIdToCard < ActiveRecord::Migration[5.2]
  def change
    add_foreign_key :cards, :users, column: :user_id, primary_key: :"id", on_delete: :cascade
  end
end

尝试此迁移。我遇到了同样的问题,然后解决了这个问题。