在我的模型中,项目拥有并属于许多用户,因此有一个连接表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返回正确的成员。我做错了什么?
答案 0 :(得分:1)
听起来您可能在数据库列上有一个唯一的约束,它不允许在project_id
中重复user_id
和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
。