Re: [問題] after_initialize and after_find
※ 引述《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
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章