浏览 2354 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-22
但是method missing也不是那么完美。各种rails性能优化的文章都建议避免使用method missing,原因很简单,method missing的实现机制确实会是增加call ruby stack次数。 使用method missing + define method,调用一次method missing后动态定义方法来减少call ruby stack次数。 class A def method_missing(method_id, *args) puts "method missing stack called.." if method_id.to_s =~ /^find_by_(.*?)$/ name = $1 self.class.send(:define_method, method_id) do name end send(method_id, *args) else super end end end obj = A.new p obj.find_by_title p obj.find_by_title 输出: method missing stack called.. "title" "title" #第二次没有执行method missing方法.. rails里的find by和动态属性都是这样实现的: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_methods.rb 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-06-10
最后修改:2011-06-10
这个会不会覆盖掉其他方法?
而且会增加很多无用的方法吧。 |
|
返回顶楼 | |
发表时间:2011-06-10
orcl_zhang 写道 这个会不会覆盖掉其他方法?
而且会增加很多无用的方法吧。 1.当然不会。。因为是在methodmissing执行时候才能定义方法的 比如A.new.find_by_name("Hooopo"),执行过程是这样的: 第一次执行:这个方法不存在->执行method missing->定义方法find_by_name 第二次执行:直接调用find_by_name 2.拿find_by_database_colum这个需求来说,数据库字段个数是有限的。需要使用find by的场景更是有限的,一般就是find by id/name/uid等 |
|
返回顶楼 | |
发表时间:2011-06-10
最后修改:2011-06-10
Metaprogramming Ruby 里面也用了这个例子 http://book.douban.com/subject/4086938/ 好书
|
|
返回顶楼 | |
发表时间:2011-06-10
最后修改:2011-06-10
Hooopo 写道 orcl_zhang 写道 这个会不会覆盖掉其他方法?
而且会增加很多无用的方法吧。 1.当然不会。。因为是在methodmissing执行时候才能定义方法的 比如A.new.find_by_name("Hooopo"),执行过程是这样的: 第一次执行:这个方法不存在->执行method missing->定义方法find_by_name 第二次执行:直接调用find_by_name 2.拿find_by_database_colum这个需求来说,数据库字段个数是有限的。需要使用find by的场景更是有限的,一般就是find by id/name/uid等 哦,看错了。。 想成(:define_method, name)了。。 chloerei 写道 Metaprogramming Ruby 里面也用了这个例子 http://book.douban.com/subject/4086938/ 好书
|
|
返回顶楼 | |