2

テーブル'leave_policies'には、year、increment、およびtotal_entitledフィールドがあります。

LeavePolicyモデルに「validates_uniqueness_of:year 」を記述しました。

年フィールドを更新していなくてもupdate_attributesが機能しません。

間違いをガイドするか、より良い解決策を提案してください。

Class LeavePolicy
  validates_uniqueness_of :year
end

@leave_policyはLeavePolicyのオブジェクトです

テーブルで、:id = 1、year = 1、increment = 2、total_entitled = 3の行。id:1のような行を更新すると

@ Leave_policy.update_attributes(:total_entitled => 5)

「年はもう取っています」というエラーが出ました。

4

1 に答える 1

0

年が1の行は他になく、@ Leave_policyは実際にはIDが1の行のインスタンスであると確信していますか?

それが実際に新しいレコードである場合、この方法で失敗するか、:year==1のレコードが他にある場合。

一部の属性でupdate_attributesのみを使用している場合でも、検証はすべての属性で実行されるため、年が一意でない場合は、incrementフィールドまたはtotal_entitledフィールドのみを更新している場合でも失敗します。

一般に、validates_uniquenessはそれ自体では優れた答えではありません。競合状態によってルビーをチェックインすると、一意性を強制できなくなる可能性があるため、データベース内の一意キーとともに使用します。

他のフィールドを変更するときに一意の年の検証をスキップできるようにする場合は、モデルに属性を設定してから、

leave_policy.save(:validate => false) #for rails 3
leave_policy.save(false) #for rails 2

そしてそれはすべての検証をスキップします、しかし男、私は二度考えます。それは目的を打ち負かすように思われるので、代わりに、レールがあなたにユニークな年がないと考える理由を追求します-おそらくあなたのデータベースを見ると、その年の重複行があることがわかります==1。

于 2012-09-18T17:42:01.587 に答える