2016-07-30 70 views
1

我正在構建一個有用戶的Rails應用程序,並且用戶具有技能,而且這些技能有許多屬於用戶且具有單一技能的「skillsections」。每個技能部分都有一個文本名稱值。基於多列的Rails獨特屬性模型視圖還是控制器?

我希望能夠強制skillsection名稱值是唯一的只有如果它屬於相同的用戶和相同的技能。因此,如果一個用戶具有「管理者」的技能,我希望他們能夠爲管理者提供一個「填充」技能部分,但只有一次......並且還允許他們擁有第二個技能「紙質洗牌」以及在這裏填充的技巧部分。爲了做到這一點,我需要用戶不可能爲同一用戶和技能組合創建一個重複的技能部分名稱。

所以,我的問題是:根據MVC(通過遷移或在model.rb中的數據庫約束,或者當用戶提交表單時)來實現此目的的適當位置在哪裏?一旦確定了,什麼是方法?

irb(main):028:0> section = SkillSection.new 
=> #<SkillSection id: nil, user_id: nil, skill_id: nil, name: nil, copy: nil, rank: nil, created_at: nil, updated_at: nil> 

回答

1

我通常在模型級別和數據庫級別都添加唯一性約束。在模型做的,你可以使用scope這樣的:

validates :name, uniqueness: { scope: [: user_id, : skill_id] } 

只在模型級有時獨特性驗證不能按預期工作,所以你應該添加約束到數據庫了。要做到這一點,你可以使用如下遷移:

add_index :skill_sections, [:name, :user_id, :skill_id], unique: true 

你可以檢查http://guides.rubyonrails.org/active_record_validations.html#uniqueness欲瞭解更多信息。

在這種情況下,您不需要在控制器中執行任何操作。有關Rails驗證的更多詳細信息,請參閱http://guides.rubyonrails.org/active_record_validations.html#why-use-validations-questionmark

+0

謝謝Van Huy,這是一個非常準確和完整的答案。 – Jeremy

相關問題