SQLite3 :: ConstraintException:约束失败:INSERT INTO在Rails中加入模型

时间:2013-03-17 17:07:09

标签: ruby-on-rails sqlite activerecord

在我的模型中,项目拥有并属于许多用户,因此有一个连接表projects_users。当我插入行

@project.members += User.find params[:member_ids].split(',')

进入Projects控制器的create动作,我无法保存@project。当我尝试时,我收到以下错误:

SQLite3::ConstraintException: constraint failed: INSERT INTO "projects_users" ("project_id", "user_id") VALUES (5, 14600)

但是,在保存之前,@ project是有效的,@ project.members返回正确的成员。我做错了什么?

1 个答案:

答案 0 :(得分:1)

听起来您可能在数据库列上有一个唯一的约束,它不允许在project_id中重复user_idprojects_users对,但是Rails不知道它,所以验证通过,但实际保存失败。

如果是这种情况,您可以使用has_many through关系和联接表的模型并验证唯一性。我怀疑你已经在做那部分了。这样的事情可能会有所帮助:

class Project < ActiveRecord::Base
  has_many :members
  has_many :users, through: :project_membership
end

class User < ActiveRecord::Base
  has_many :projects, through: :project_membership
end

class ProjectMembership < ActiveRecord::Base
  self.table_name = "projects_users"
  belongs_to :project
  belongs_to :user
  validates :project_id, uniqueness: { scope: :user_id }
end

如果一切正常,您可能希望将projects_users表格重命名为project_memberships,如上例所示;然后你可以放弃self.table_name