7

レールでは、新しい検証ルールに適合するように本番データを変更する移行があります。いくつか間違っているため、2 つの異なる移行があります (それらは 1 つである可能性がありますが、別々に実行される 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 つはまったく新しいもので、もう 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

移行の順序を変更しようとしましたが、逆の結果が得られました。

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

4

2 に答える 2

22

Rails 2:

object.save(false)

Rails 3&4:

object.save(:validate => false)

これらのメソッドは、オブジェクトのすべての検証をバイパスするため、注意してください。

于 2011-02-11T00:52:36.090 に答える
1

ねえ、これは古い質問であり、すでに回答されていることは知っていますが、あなたのコメントに基づいて、2セントを残すと思いました.

Rails 2 または 3 では、単一の検証をオンまたはオフにする方法はありません。ただし、私たちのプロジェクトでは人口タスクを広範囲に使用しているため、同じことに対する小さな回避策があります。

検証ごとにそれを行うのは少し面倒ですが、一般的に、少しの間「オフ」にしたいものはほとんどありません。

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* を true に設定するだけで、検証をバイパスできます。

また、2番目のコメントについては、次のとおりです。

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

同じように働きます。

もちろん、前述の条件付き検証も両方で機能します。

于 2012-10-08T13:30:45.377 に答える