Rails基于多列模型视图或控制器的唯一属性?

时间:2016-07-30 17:55:43

标签: ruby-on-rails ruby model-view-controller

我正在构建一个拥有用户的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>

1 个答案:

答案 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