作者tonytonyjan (南洋大兜虫)
看板Ruby
标题Re: [问题] after_initialize and after_find
时间Fri Aug 26 12:35:22 2011
※ 引述《godfat (godfat 真常)》之铭言:
: ※ 引述《tonytonyjan (南洋大兜虫)》之铭言:
: : 环境:
: : Ruby 1.9.2 Rails 3
: : 状况:
: : 我在阅读Rails Guide时,发现 after_initialize 和 after_find
: : 没有相对的 before_initialize 及 before_find
: : 并说要使用时必须以 method define,不能用 handler
: : 摘录:
: : If you try to register after_initialize or after_find using macro-style class
: : methods, they will just be ignored.
: : This behaviour is due to performance reasons, since after_initialize and
: : after_find will both be called for each record found in the database,
: : significantly slowing down the queries.
: : 我觉得这样的解释我还是看不太懂
: : 1. 这和 self reflection 有关系吗?
: 这边 self reflection 是指?
就是反射,我想handler靠的就是反射做到的吧,而反射比起直接呼叫要来得吃效能
所以忽略handler的写法,就视同避免反射发生,让效率更好
但这也只是我的猜测,没有什麽根据
http://en.wikipedia.org/wiki/Reflection_(computer_programming)
: : 2. 一个 select query 可能包涵数万笔资料,不管是用 method define 还是 handler
: : ,都要被呼叫数万次吧?如此效能还不是一样差吗?
: 我也觉得没差..... 应该一样,不然就是他写得有问题?
同上面的回覆
: : 3. 对一个 callback 同时使用 method define 和 handler 会导致 handler 被盖掉吗?
: 实验看看?
实验结果是不会盖掉,但是有新的发现:
我的程式码是这样:
6 before_validation :test
7
8 def before_validation
9 logger.info("Using method define.");
10 end
11
12 def test
13 logger.info("Using handler");
14 end
Log:
DEPRECATION WARNING: Base
#before_validation has been deprecated, please use
Base.before_validation :method instead. (called from <class:Grade> at
/usr/home/tonytonyjan/public_html/rails/snowall/app/models/grade.rb:6)
Using handler
Using method define.
但是我对调一下顺序,警告又会消失:
6 def before_validation
7 logger.info("Using method define.");
8 end
9
10 before_validation :test
11
12 def test
13 logger.info("Using handler");
14 end
第二个版本的程式码我觉得很奇怪,如果说before_validation的handler是method
而注册handler的功能就写在里面,那麽照理来说
handler写法会因为先被我定义的before_validation 给 override 导致无效吧……
但实验结果却还是有注册到,百思不得其解……
还有更奇怪的……
10 after_initialize :test
11
12 def test
13 logger.info("Using handler");
14 end
Log:
Using handler
所以我被文件骗了吗?(眼神死)
而我照着文件的说的做,用method define,竟然也跑出和上面同样的警告……
谁可以告诉我这是为什麽Orz
: : 4. 我想看原始码,但是在github里面有如大海捞针,希望得到众神的指引
: 你可以直接看电脑里装好的 source, 然後用搜寻的
: 抱歉现在没有空,所以就先不查也不实验了..
实验完就到吃饭时间了,等等再查Orz
谢谢真常大的回覆=)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.227.148.54