Rails 3でこれらの行に沿って何かをしてコールバックと検証をスキップする方法はありますか?コールバックと検証をスキップする
Object.save(:validate => false, :skip_callbacks => true)
ありがとうございます!
Rails 3でこれらの行に沿って何かをしてコールバックと検証をスキップする方法はありますか?コールバックと検証をスキップする
Object.save(:validate => false, :skip_callbacks => true)
ありがとうございます!
を私は前にそのような何かに遭遇し、私はこれを使用:
Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)
http://guides.rubyonrails.org/active_record_validations_callbacks.html詳細コールバックと検証を回避する小さなリスト - 「保存」もありません。
ただし、検証とコールバックのポイントはビジネスロジックを強制することです。あなたがそれらを避けているなら - あなたはなぜ自分自身に尋ねるべきです。
も参照してください:あなたのようにHow can I avoid running ActiveRecord callbacks?
Object.save(:validate => false)
作品が期待されます。私が知っている限り、コールバックをオフにすることはできません(before_コールバックからfalseを返さない限り、トランザクションを中断しない限り)。
コールバックをスキップするのはちょっと難しいです。一部のプラグインとアダプタは、独自の「必須」コールバック(acts_as_nested_set、oracle_enhanced_adapter)を追加します。
スキップできるものを確認するには、skip_callback
とset_callback
の方法を使用できます。
いくつかのカスタムクラスメソッドは助けることができる:
def skip_all_callbacks(klass)
[:validation, :save, :create, :commit].each do |name|
klass.send("_#{name}_callbacks").each do |_callback|
# HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs)
if (_callback.filter != :enhanced_write_lobs)
klass.skip_callback(name, _callback.kind, _callback.filter)
end
end
end
end
def set_all_callbacks(klass)
[:validation, :save, :create, :commit].each do |name|
klass.send("_#{name}_callbacks").each do |_callback|
# HACK - the oracle_enhanced_adapter write LOBs through an after_save callback (:enhanced_write_lobs)
if (_callback.filter != :enhanced_write_lobs)
klass.set_callback(name, _callback.kind, _callback.filter)
end
end
end
end
のRails 3でコールバックをスキップするために、あなたは与えられたためupdate_all
を使用することができます目的。
出典:update_all
コールバックをスキップする完全なリストはここにある:
ソースincrement_counterリーメント
あなたはすべてのコールバックをスキップしてレコードを更新しようとしている場合と、あなたの検証ould属性のハッシュを渡してupdate_columns
を使用してください。このメソッドは、データベース上の列を直接更新します。例えば
:
object.update_columns(name: 'William')
あなたは新しいオブジェクトを作成したい場合は、残念ながら私は、検証とコールバックの両方をスキップする方法がないと思います。 save(:validate => false)
は検証のために機能します。コールバックの場合はskip_callback
を使用できますが、注意してください。おそらくコードはスレッドセーフではありません。
+1ありがとうございました... – ecoologic
Rails 4では動作しません。 –