2016-07-30 4 views
1

私は、ユーザーを持ち、ユーザーにスキルがあり、スキルにはユーザーに属し、単一のスキルを持つ多くの「スキル面」があるレールアプリを構築しています。各スキルセクションには、テキストである名前の値があります。複数の列に基づくRails固有の属性モデルビューまたはコントローラ?

同じユーザーと同じスキルに属している場合は、スキルセクションの名前の値が一意であることを強制できます。

ユーザーが「マネージャー」のスキルを持っていれば、マネージャーの「充満」のスキルを1回だけ持つことができます"紙シャッフル"とそこにいっぱいの才能もあります。優雅にこれを行うには、ユーザーが同じユーザーとスキルの組み合わせに対して複数のスキルセクション名を作成することは不可能である必要があります。

私の質問は、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

関連する問題