论坛首页 编程语言技术论坛

after_find不见了

浏览 7949 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-09-13  
ruby 敏捷编程 中提到有个callback 是after_find,在find之后调用?刚刚好,有些数据在从数据库读出来之后,需要预处理下才能使用,于是就用了after_find,结果after_find根本就不起作用.最后才发现根本没有after_find这个callback...
Rails -v
#=>Rails 1.1.6
如果没有after_find,怎么在读取数据之后,使用数据之前,在models 加入能够被自动调用的预处理方法呢?

PS: after_initialize  也找不到


   发表时间:2006-09-13  
可以使用Observers.
0 请登录后投票
   发表时间:2006-09-13  
其它一些callbacks都是在修改记录后调用,find可能是因为这个原因没有加入。

你可以这样来做:

  def self.find(*args)
    result = super(*args)
    logger.debug(result.class)
    result
  end

显然不光是可以做after。。。
0 请登录后投票
   发表时间:2006-09-13  
查了一下,并不是真的不支持,只要加这点代码:

  after_find "puts 111"
  protected
  def after_find
  end


这个可能多次执行,每一条记录被find出来都会执行一次。
0 请登录后投票
   发表时间:2006-09-13  
qiezi 写道
查了一下,并不是真的不支持,只要加这点代码:

  after_find "puts 111"
  protected
  def after_find
  end


这个可能多次执行,每一条记录被find出来都会执行一次。

after_find 的code在 ActiveRecord::Callback 中不存在,而其他的callback都有.
前面一个改写find的方法,我试了下可以,这个方法没有看明白怎么用
0 请登录后投票
   发表时间:2006-09-13  
qiezi 写道
查了一下,并不是真的不支持,只要加这点代码:

  after_find "puts 111"
  protected
  def after_find
  end


这个可能多次执行,每一条记录被find出来都会执行一次。

after_find 的code在 ActiveRecord::Callback 中不存在,而其他的callback都有.
前面一个改写find的方法,我试了下可以,这个方法没有看明白怎么用

...............
晕 点了2下提交 还没有删除的地方
0 请登录后投票
   发表时间:2006-09-13  
你看文档不仔细啊:

Because after_find and after_initialize are called for each object found and instantiated by a finder, such as Base.find(:all), we’ve had to implement a simple performance constraint (50% more speed on a simple test case). Unlike all the other callbacks, after_find and after_initialize will only be run if an explicit implementation is defined (def after_find). In that case, all of the callback types will be called.
0 请登录后投票
   发表时间:2006-09-13  
cookoo 写道
你看文档不仔细啊:

Because after_find and after_initialize are called for each object found and instantiated by a finder, such as Base.find(:all), we’ve had to implement a simple performance constraint (50% more speed on a simple test case). Unlike all the other callbacks, after_find and after_initialize will only be run if an explicit implementation is defined (def after_find). In that case, all of the callback types will be called.

谢谢提醒了,不过这里提到一个效率问题,实际上 每次进行这样的计算的确很慢,那么能否指计算一次呢?

换句话说,就是在rails中能否使用一般意义上的单件类。类似这种after_find的操作,每次的计算基本上一样的。如果能够使用单件类,就能够极大的改善性能。不过这样的单件类得要提供给所有的用户使用,而且只能计算一次.
0 请登录后投票
   发表时间:2006-09-13  
after_finder 和before_finder方法,rails做了特别处理。因为影响性能,他会先找你的module里有没有定义这个方法,如果没有定义。他就不调用。不起作用。要使用就得类似这样: 

after_find "puts 111"
  protected
  def after_find
  end
//抄楼上仁兄的代码 ;)

rails那本书中讲到过。也可以查看文档。如上。


关于单件类,是针对每个object对象一个单件类.是为了给对象动态增加方法的.那么如何让所有的对象都指向一个单件类呢?反过来说,如果都指向一个单件类的话,不就是他们的共同的class了么.又绕回来了.
0 请登录后投票
   发表时间:2006-09-13  
jack 写道

谢谢提醒了,不过这里提到一个效率问题,实际上 每次进行这样的计算的确很慢,那么能否指计算一次呢?

换句话说,就是在rails中能否使用一般意义上的单件类。类似这种after_find的操作,每次的计算基本上一样的。如果能够使用单件类,就能够极大的改善性能。不过这样的单件类得要提供给所有的用户使用,而且只能计算一次.

什么叫计算一次?大部分时候都需要针对不同对象具体计算的,性能改善总得在满足需求的前提下。如果是不针对具体数据/对象的计算那就如上面qiezi说的过载一下类方法好了, 所谓修改类的单子类就是修改类方法。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics