前の回答は、: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つの属性を入力させることです(長さと幅の両方は実際には必要ありません)。それらは常に同じ値を表します)、長さ*幅を掛けるのではなく、計算をその値の2乗に変更します。
- 長さと幅の両方が必要な場合は、問題をもう少し明確に説明できますか。特定のモデルの属性:lengthおよび:breadthを記録するフォームまたはインターフェースがあるとします。モデルのインスタンスはまだありません。ユーザーがシステムを操作するのはこれが初めてです。入力はリクエストの一部としてコントローラーに送信され、有効な:length値と:breadth値を使用してオブジェクトを作成します。その後、ユーザーは:lengthと:breadthを変更したいと考えています。:length /:breadthを含むモデルの新しいインスタンスを作成しますか、それとも既存のモデルインスタンスの:length /:breadth属性を更新しますか?