2013-03-17 93 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