-1

そのエンティティの値が既に存在するかどうかを確認する検証はありますか。存在する場合、ユーザーは前の値を破棄せずに別の値を保存できません。

ユーザーが新しい値を作成する前に以前の値を破棄する必要があるというメッセージを表示できます。それは問題ではありません。

問題は、2 つのエンティティに対して 1 つの値のみを確認して許可する検証または方法があるかどうかです。

長さと幅の 2 つのフィールドがあり、長さの値と幅の値を 1 つだけ持ちたいと考えています。

質問を読んでいただきありがとうございます。私が得ることができる助けに感謝します。

4

3 に答える 3

0

前の回答は、:field1と:field2の値の組み合わせが一意であることを保証します。私は質問を理解するのに苦労していますが、abhishekは実際にはもっと簡単な答えを探していると思います。

彼は、長さの値と幅の値が1つだけであることを確認したいと思っています。

長さと幅の関連付けはありますか?または属性?どちらの場合でも、おそらくdestroyそれらを置き換えるために呼び出す必要はありません。属性または関連付け内の値を変更して保存するだけです。

明確にできますか?


さて、グリッドモデルに基づいて、これらのフィールドに複数の値が設定されることはありません。最初の検証が成功した後、レコードを読み取り専用としてマークすることができます。その後、ユーザーが値を更新しようとすると、検証エラーが発生します。ニーズに合わせて読み取り専用フラグをオーバーライドする簡単なロジックを作成する必要があります。

ここで、既存の値がある場合に常に検証エラーをトリガーする場合は、次のようにすることができます。

validate :error_if_length_exists, :if 'length.present?'
validate :error_if_breadth_exists, :if 'breadth.present?'

def error_if_length_exists
  errors.add(:length, "already exists, are you sure you want to update?")
end

def error_if_breadth_exists
  errors.add(:breadth, "already exists, are you sure you want to update?")
end

私はあなたが使いたいと思いますunless

def is_it_square
  unless (length == breadth)
     errors.add(:length, "Latest research and our experience shows that a rectangular region is more effective for this kind of mission.")
  end  
end

次のように検証のスコープを設定することもでき ます。最初にレコードを作成するときvalidates :length, :breadth, :presence_of => true, :on => :createにのみチェックを適用します。presence_of

:createと:updateの検証を変えたいようです。


私はあなたが解決しようとしている問題を間違いなく誤解していると思います。いくつかの提案。

  1. 値が同じでないときに単にエラーを追加する場合は、両方の値を入力するようにユーザーに依頼する必要はないと思います。使いやすさの解決策は、入力の近くにエラーテキストを追加し(「正方形が最適な形状であることがわかりました...」)、ユーザーに1つの属性を入力させることです(長さと幅の両方は実際には必要ありません)。それらは常に同じ値を表します)、長さ*幅を掛けるのではなく、計算をその値の2乗に変更します。
  2. 長さと幅の両方が必要な場合は、問題をもう少し明確に説明できますか。特定のモデルの属性:lengthおよび:breadthを記録するフォームまたはインターフェースがあるとします。モデルのインスタンスはまだありません。ユーザーがシステムを操作するのはこれが初めてです。入力はリクエストの一部としてコントローラーに送信され、有効な:length値と:breadth値を使用してオブジェクトを作成します。その後、ユーザーは:lengthと:breadthを変更したいと考えています。:length /:breadthを含むモデルの新しいインスタンスを作成しますか、それとも既存のモデルインスタンスの:length /:breadth属性を更新しますか?
于 2012-10-07T20:44:43.287 に答える
0

オプションを使用して、validates_uniqueness_of組み込みの検証を使用できます。:scope

validates_uniqueness_of :length, :scope => :breadth
于 2012-10-07T20:04:30.390 に答える
0

私があなたの言うことを正しく理解しているなら、あなたは2つの分野の独自性の組み合わせを提供する必要があります。

次に、usersテーブルの例について

model.rb

validates :field1, uniqueness: { :scope => :field2}

コンソール

rails generate migration add_index_for_field1_and_field2_to_users

移行を編集する

class AddIndexFoField1AndField2ToUsers < ActiveRecord::Migration
  def change
    add_index :users, [:field1, :field2], unique: true
  end
end

移行を実行する

rake db:migrate

出来上がり!

アップデート

正しくしたかどうかを確認する方法。

コンソール

Model.create!(field1:"foo",field2:"bar") # true
Model.create!(field1:"foo",field2:"bar") # ActiveRecord::RecordInvalid: Validation failed: Field1 has already been taken

SQLデータベース

insert into table(field1, field2) values ("foo","bar") # true
insert into table(field1, field2) values ("foo","bar") # ERROR: diplicate key value violates unique constraint "index_table_on_field1_and_field2"
于 2012-10-07T20:04:58.847 に答える