【问题标题】:Rails callback for the equivalent of "after_new"等效于“after_new”的 Rails 回调
【发布时间】:2011-02-19 15:24:18
【问题描述】:

现在我找不到在第 1 行和第 2 行之间生成回调的方法:

f = Foo.new
f.some_call
f.save!

有没有办法模拟什么是有效的 after_new 回调?现在我正在使用 after_initialize 但使用它存在潜在的性能问题,因为它会触发许多不同的事件。

【问题讨论】:

    标签: ruby-on-rails activerecord callback


    【解决方案1】:

    您可以使用after_initialize 回调

    # app/models/foo.rb
    class Foo < ActiveRecord::Base
      after_initialize :some_call
    
      def some_call
        puts "Who you gonna call?"
      end
    end
    
    # rails console
    > foo = Foo.new # => "Who you gonna call?"
    > foo = Foo.first # => "Who you gonna call?"
    

    请注意,每次 ActiveRecord 执行 Foo.new(如 newfindfirst 等调用)时都会触发 after_initialize,请参阅 Rails Guide

    所以你可能想要这样的东西after_initialize :some_call, :if =&gt; :new_record?

    # app/models/foo.rb
    class Foo < ActiveRecord::Base
      after_initialize :some_call, :if => :new_record?
    
      def some_call
        puts "Who you gonna call?"
      end
    end
    
    # rails console
    > foo = Foo.new # => "Who you gonna call?"
    > foo = Foo.first
    

    【讨论】:

      【解决方案2】:

      Foo 定义一个构造函数并在那里做你需要做的事情。

      另一种解决方案是考虑使用after_initialize,但这可能不会达到您的预期。

      【讨论】:

        【解决方案3】:

        如果这是一个 Active Record 模型,那么 after_initialize 是在对象创建后处理回调的正确方法。框架本身对从数据库创建对象的方式做出了某些假设。除非您在回调中触发了一些长时间运行的任务,否则性能不应成为问题,在这种情况下,您可能需要重新考虑策略。

        如果不是 AR 模型,您可以在对象中创建一个初始化方法并将代码放在那里。

        根据您想要执行的操作,还有许多其他可用的回调,包括 after_create(在创建新记录时调用)。

        【讨论】:

        • 嗨,是的,它是活动记录,我在渲染“新”视图之前设置了一些必需的关联。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多