5

私のモデルでは、これがあります:

validates :name, :presence => true, :uniqueness => true

私のコントローラーには次のものがあります:

...
if @location.save
    format.html { redirect_to @location, :notice => 'Location was successfully created.' }
    format.json { render :json => @location, :status => :created }
...

この名前のレコードがテーブルにまだ存在しない場合は、レコードが正常に作成されます。DB の制約に頼るのではなく、重複する可能性のあるレコードを挿入する前に確認することをお勧めしますか?

確認するためにコントローラーに何かを追加する必要があると思いますか?これを行う正しい方法は何ですか?

どうもありがとう。

4

5 に答える 5

7

データベースに一意のインデックスを追加します。そうすれば、何かがモデルの検証をすり抜けた場合 (まれですが、技術的には可能です)、データベースに保存するクエリは失敗します。

于 2013-05-24T13:06:58.243 に答える
4

あなたの検証は正しいです。上記の他のすべての回答と同じように、複数のフィールドを検証したい場合、たとえば と を取るウィッシュリストがあると仮定するuser_idと、item_id各項目をユーザーが一度だけ追加する必要があります。この種のシナリオでは、これを追加しますモデルに対する検証のタイプ

Class class_name < ActiveRecord::Base
  validates_uniqueness_of   :item_id, scope: :user_id
end
于 2016-07-15T12:01:28.783 に答える
3

Railsで一意性を検証する正しい方法があり、それは検証によるものです。コントローラーでこれをチェックする必要はありません。これは検証によって行われるためです。

一意性の検証を追加しても、データベース内に一意のレコードがあることは保証されないことに注意してください。これは、APIのvalidates_uniqueness_of ドキュメントでうまく説明されています。

于 2013-05-24T13:04:02.627 に答える