次のように私はモデルを持っている:私がやりたい実行時にActiveRecordアソシエーションから返されたオブジェクトをどのように拡張できますか?
class Property < ActiveRecord::Base
has_and_belongs_to_many :property_values
end
何がPropertyオブジェクトの属性によって決定されたモジュールと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など)のどれもfindに代理するように見えません。次に、エイリアシングを行った方法で、findを直接実行しようとすると、スタックのオーバーフローが発生します。
私は何をしようとしていますか?どのような方法でエイリアスとオーバーライドできますか?すべての結果は、関連付け拡張子によって返されますが、それらの取得方法に関係なく、適切なモジュールで拡張されますか? (私は別名が行われる方法を変更)
おかげで、クリス
ありafter_findだとあなたが定義することができafter_initializeコールバックが、それは大きなパフォーマンスの低下を招くことになりますので、それは本当にお勧めできません。 – jemminger