看板 Ruby 關於我們 聯絡資訊
※ 引述《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