gpt4 book ai didi

ruby-on-rails - 如何避免运行 ActiveRecord 回调?

转载 作者:数据小太阳 更新时间:2023-10-29 06:17:12 25 4
gpt4 key购买 nike

我有一些模型具有 after_save 回调。通常这很好,但在某些情况下,例如创建开发数据时,我想在不运行回调的情况下保存模型。有没有一种简单的方法可以做到这一点?类似于...

Person#save( :run_callbacks => false )

Person#save_without_callbacks

我查看了 Rails 文档,但没有找到任何内容。然而,根据我的经验,Rails 文档并不总能说明全部情况。

更新

我找到了 a blog post这解释了如何从这样的模型中删除回调:

Foo.after_save.clear

我找不到记录该方法的位置,但它似乎有效。

最佳答案

使用 update_column (Rails >= v3.1) 或 update_columns (Rails >= 4.0) 跳过回调和验证。此外,使用这些方法,updated_at 不会 更新。

#Rails >= v3.1 only
@person.update_column(:some_attribute, 'value')
#Rails >= v4.0 only
@person.update_columns(attributes)

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column

#2:跳过在创建对象时也有效的回调

class Person < ActiveRecord::Base
attr_accessor :skip_some_callbacks

before_validation :do_something
after_validation :do_something_else

skip_callback :validation, :before, :do_something, if: :skip_some_callbacks
skip_callback :validation, :after, :do_something_else, if: :skip_some_callbacks
end

person = Person.new(person_params)
person.skip_some_callbacks = true
person.save

更新(2020 年)

显然是 Rails has always supported :if and :unless options ,所以上面的代码可以简化为:

class Person < ActiveRecord::Base
attr_accessor :skip_some_callbacks

before_validation :do_something, unless: :skip_some_callbacks
after_validation :do_something_else, unless: :skip_some_callbacks
end

person = Person.new(person_params)
person.skip_some_callbacks = true
person.save

关于ruby-on-rails - 如何避免运行 ActiveRecord 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/632742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com