4

私はレールに不慣れで、これに何かを見つけることができませんでした。

私のアプリには、製品、レビュー、およびユーザーがあります。

レビューはユーザーと製品に属しますが、ユーザーと製品の両方に「has_many」のレビューがあります。

ただし、ユーザーが製品ごとに複数のレビューを入力することを制限したいと考えています (各製品は一意です)。そのため、ユーザーが製品のレビューを作成し、同じ製品の別のレビューを書き込もうとすると、許可されていないが、既存のレビューを編集できると言われます。

私の質問は次のとおりです。コントローラーレベルでこれを行う必要がありますか、それとも検証で行うことができますか (より単純なソリューションのようです)。それにアプローチする方法がわからないだけです。

4

2 に答える 2

10

これは、モデルの検証を使用して簡単に行うことができ、インデックスも役立ちます。ただし、ActiveRecord の検証を伴わずに一意のインデックスを作成すると、保存が暗黙のうちに失敗し、ユーザビリティ/デバッグの問題が発生します。

これはそれを行う必要があります:

class Review < ActiveRecord::Base
  validates :user_id, :uniqueness => { :scope => :product_id,
    :message => "Users may only write one review per product." }
end

インデックスを追加する場合は、移行でこれを試してください。

class AddUniquenessConstraintToReviews < ActiveRecord::Migration
  add_index  :review, [:user_id, :product_id],
    :name => "udx_reviews_on_user_and_product", :unique => true
end

編集: フルタイムの Rails 開発者として、私は今でもActiveRecord のドキュメントを参照して、これらの構文の復習をかなり定期的に行っています。あなたもすべき!

于 2013-06-04T14:01:18.423 に答える