首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >等效于"after_new“的Rails回调

等效于"after_new“的Rails回调
EN

Stack Overflow用户
提问于 2010-05-15 01:26:31
回答 3查看 7.6K关注 0票数 18

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

代码语言:javascript
运行
复制
f = Foo.new
f.some_call
f.save!

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-22 17:50:11

您可以使用after_initialize回调

代码语言:javascript
运行
复制
# 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等调用)查看Rails Guide时,都会触发after_initialize

所以你可能想要像这样的after_initialize :some_call, :if => :new_record?

代码语言:javascript
运行
复制
# 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
票数 47
EN

Stack Overflow用户

发布于 2010-05-15 01:29:10

Foo定义一个构造函数,并在其中执行所需的操作。

另一种解决方案是考虑使用after_initialize,但这可能并不完全符合您的期望。

票数 4
EN

Stack Overflow用户

发布于 2010-05-15 09:30:11

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2836206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档