我有一個模型,如下所示:如何在運行時擴展從ActiveRecord關聯返回的對象?
class Property < ActiveRecord::Base
has_and_belongs_to_many :property_values
end
我想要做的是延長一個找上了property_values擴展與由物業對象的屬性所決定的模塊返回的任何值。我曾嘗試過這樣的事情:
class Property < ActiveRecord::Base
has_and_belongs_to_many :property_values, :extend => PropertyUtil::Extensible
def enrich(to_extend)
modules.split(/\s*,\s*/).each do |mod|
to_extend.extend(Properties.const_get(mod.to_sym))
end
end
end
module PropertyUtil
module Extensible
def self.extended(mod)
mod.module_eval do
alias old_find find
end
end
def find(*args)
old_find(*args).map{|prop| proxy_owner.enrich(prop)}
end
end
end
如果可以選擇的所有模塊屬性模塊中定義。然而,在嘗試使用此代碼運行時,存在一些問題;首先,令我驚訝的是,似乎沒有一個動態查找器(property_values.find_by_name等)可以委託查找;其次,當我嘗試直接運行查找時,我如何完成別名會導致堆棧溢出。
有沒有辦法做我想做的事情?我可以使用什麼方法進行別名和覆蓋,使得關聯擴展返回的結果無論其檢索方式如何,都可以使用適當的模塊進行擴展?
謝謝,克里斯
有after_find並且可以定義after_initialize回調,但它不是真正的推薦,因爲它會導致一個很大的性能損失。 – jemminger 2011-03-19 03:13:35