1

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

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

进入项目控制器的创建操作,我无法保存@project。当我尝试时,我收到以下错误:

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

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

4

1 回答 1

1

听起来您可能对 DB 列有一个唯一约束,该约束不允许重复project_iduser_id对 in projects_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.

于 2013-03-17T17:29:13.037 回答