2013-03-17 58 views
1

在我的模型中,项目拥有并属于许多用户,因此他们有一个连接表projects_users。当我插入行SQLite3 :: ConstraintException:约束失败:INSERT INTO在Rails中加入模型

@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返回正确的成员。我究竟做错了什么?

回答

1

这听起来像你可能对DB列不允许projects_users重复project_iduser_id对唯一约束,但Rails是没有意识到这一点,所以校验通过,但保存失败的实际。

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

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

+0

我如何才能找到有关db的唯一约束?我查看了迁移和模式,没有看到这个约束,我也没有在任何地方指定它。除此之外,我没有插入重复的project_id和user_id对,每个user_id都是唯一的。 – 2013-03-17 18:06:21

+0

虽然我不明白我违反了什么限制,但这个答案确实有效。看来HABTM关系在Rails中越来越不受支持。 – 2013-03-18 01:05:59