我正在构建一个拥有用户的rails应用程序,并且用户拥有技能,并且这些技能具有许多属于用户并具有单一技能的“技能部分”。每个技能部分都有一个名称值,即文本。
如果它属于同一个用户和同一技能,我希望能够强制技能部分名称值为唯一仅。
所以,如果一个用户具有“经理”的技能,我希望他们能够为经理“填充”技能部分,但只有一次......并且还允许他们拥有第二个技能“纸张洗牌“和填补那里的技巧部分。为了优雅地这样做,我需要用户不能为相同的用户和技能组合创建重复的技能部分名称。
所以,我的问题是:根据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>
答案 0 :(得分: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