2011-02-11 6 views
7

レールで私は新しいバリデーションルールに合わせて本番データを変更することが必要ですが、いくつかの問題がありますので2つの異なるマイグレーションがあります。他の検証が満たされないと、その逆データのマイグレーション中にバリデーションをバイパスしてバリデーションエラーを修正する

検証が

validates_uniqueness_of :job_id , :scope => [:day, :time, :user_id , :overtime, :comments] , :message => "Duplicate Entry, Please check your data" 
validates_uniqueness_of :job_id , :scope => [:day, :user_id, :comments] , :message => "Has 2 Entires for same job on same day with same comment" 

ようなモデルで新たに追加されましたので、1が失敗した)個別に実行することは、完全に 新しい、他のちょうどに24から変更された一種であります8とオーバータイムビットを追加

validates_numericality_of :time, :greater_than => 0, :less_than_or_equal_to => 8 
    validates_numericality_of :overtime, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 16 

私は移行を再注文しようとしましたが、私は逆の結果を得ました。

これを回避するには、データベースを最初に更新してからこのファイルを更新する以外の方法がありますか? それとも私は何をすべきか? Railsの2で

答えて

21

object.save(false) 

Railsの3 & 4:

object.save(:validate => false) 

これらのメソッドは、オブジェクト上の任意およびすべての妥当性検査をバイパスしますので、注意してください!

+0

私はそれがいくつかの検証をバイパスするようにとにかくあると仮定します。ちょうどchekcing – loosecannon

+0

それはobject.saveのために働きます!また – loosecannon

+0

ここでは、ハッシュを使用する違いが重要です。最初のものはRails 2では動作しません。 –

1

こんにちは私はこれは古い質問で、既に答えられていることを知っていますが、あなたの意見に基づいて私は2セントを残すと思っていました。

Rails 2または3では、1回の検証をオンまたはオフにする方法はありません。しかし、私たちはプロジェクトで人口の仕事を広範囲に使用しているので、同じような小さな回避策があります。

1回の検証ごとにそれをやりたいのであればちょっと退屈ですが、一般的には少しだけ「オフ」にしたい方がほとんどありません。あなたは、強力な命名規則に従っている場合

class FooModel < ActiveRecord::Base 

    validates_uniqueness_of :foo_name, :unless => :dont_check_foo_name 
    attr_accessor :dont_check_foo_name 

end 

、あなたがオブジェクトを作成し、あなたができる簡単なセット適切なdont_check_ * validation_nameの真に*と、それは検証をバイパスします。

また、2番目のコメントのために、以下:同じように

object.save(false) 
object.save!(false) 

作品。

もちろん、私が言及した条件付き検証は、両方で同様に動作します。

+0

hmm面白いです。私はそれを必要としていたものは何も作業していませんが、私はその考えが好きです。 – loosecannon

関連する問題