【问题标题】:is there a callback which runs just before the transaction begins in rails ActiveRecord?在 Rails ActiveRecord 中事务开始之前是否有一个回调运行?
【发布时间】:2013-04-12 19:47:28
【问题描述】:

我只想在新创建或更新模型级别对象时对其进行操作。 例如,假设有一个带有 name 属性的测试表:

class Test < ActiveRecord::Base
  custom_callback :hi
  def hi
    name = "h"
  end
end
m = Test.new(:name => "hello")
m.save

我只想编写一个自定义回调,它应该在 before_validation 之前执行,并且应该在保存或保存时执行!叫做。理想情况下,我希望在 rails 2.3 中有一些回调,它应该被执行并挂接到 ActiveRecord::Base。是否有任何宝石可以做到这一点,或者有人知道如何编写一个在“before_validation”回调之前执行的回调吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    您可以覆盖savesave! 方法来有效地注入代码。还有 initialize 方法可能适用,具体取决于您要执行的操作。另外,before_validationvalidate 之前运行,那么您需要它提前多长时间才能准确运行,为什么?

    您能否详细说明为什么您想这样做?听起来您可能遇到了设计问题,并且您正在尝试寻找破解方法,而不是解决更基本的问题。

    【讨论】:

    • 我不想覆盖保存和保存!方法,因为在所有模型中重写的风险很小,我只想在构建对象时对其进行操作,这样我就不会将其带到事务级别。有很多地方 before_validation 方法没有被触发,我想以这种方式解决它
    • 好的,那么您能否详细解释一下您在回调中此时尝试执行的操作以及您尝试执行此操作的原因?您提供的示例代码很好,但它没有触及您所暗示的代码设计问题的根源,也没有解释您的具体情况和/或您为什么要走出去提供的解决方案/回调结构,这使得提供有用的答案有点困难。
    • 我的问题是 before_validation 没有触发关联,并且始终保存关联的成本很低。所以我想确保这个方法总是在关联上被调用..当我构造模型的对象时需要操纵对象
    • 有没有办法编写一个在保存或保存之前调用的自定义调用!方法被调用了吗?
    • 不,我不相信有一种方法可以在不修补 ActiveRecord::Base 的情况下添加本质上是另一个回调。但是,validates_associated 会做您想做的事吗?在保存或更新父对象时触发关联对象的方法调用? apidock.com/rails/ActiveModel/Validations/ClassMethods/…
    【解决方案2】:

    您似乎正在寻找 before_save,它在验证后运行:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

    请参考This answer

    【讨论】:

    • 如果我在 before_save 中执行它,验证可能会被跳过,因为您正在验证某些属性并操作和存储一些不同的属性
    • 您始终可以使用.valid? 来确保它仍然有效,否则会导致 before_save 失败。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多