如果我有在ActiveRecord的子對象的集合對象,即紅寶石類型的集合中的ActiveRecord
class Foo < ActiveRecord::Base
has_many :bars, ...
end
,我嘗試運行Array的find
針對收集方法:
foo_instance.bars.find { ... }
我收到:
ActiveRecord::RecordNotFound: Couldn't find Bar without an ID
我認爲這是因爲ActiveRecord劫持了find
方法爲自己的目的。現在,我可以使用detect
,一切都很好。然而,爲了滿足自己的好奇心,我嘗試使用元編程來明確地偷find
方法回來一個運行:
unbound_method = [].method('find').unbind
unbound_method.bind(foo_instance.bars).call { ... }
,我收到此錯誤:
TypeError: bind argument must be an instance of Array
這麼清楚Ruby沒有想到foo_instance.bars
是一個數組,但:
foo_instance.bars.instance_of?(Array) -> true
任何人可以幫助我的這個和方法相關的解釋來解決它metaprogramm ING?
要澄清這裏,.all方法實際上檢索所有關聯模型,根據關聯的類型可能有巨大的內存影響。例如,如果它是User has_many:posts,那麼您可能正在檢索用戶的整個發佈歷史記錄,這可能是大量的數據。在可能的情況下,嘗試使用條件或命名範圍構建查找調用,以獲得更好的性能。 – tadman 2009-07-08 19:38:20