Rails 2.3.5 から 2.3.17 にアップグレードしていますが、かなりあいまいな問題に遭遇しました。次の拡張機能を使用して、関連付けアクセサー内にスコープを挿入し、カスタム ビルダーを提供します。
module XYZFilterExtension
def in_context(context)
if proxy_owner.context == :abc && context != :admin
scoped(:conditions => {:startup => false})
else
scoped({})
end
end
end
module OtherExtension
def build_with_component_instance(attributes = nil)
attributes ||= {}
attributes.reverse_merge!(:parent_id => proxy_owner.component_instance.id)
instance = build
instance.build_component_instance
instance.attributes = attributes
instance
end
end
has_many :pages, :extend => [ABCExtension, OtherExtension]
Rails 2.3.5 では、次のように呼び出すことができます。
Something.pages.in_context(:abc).build_with_component_instance
そして、私は Page オブジェクトを取得します (そして、それcomponent_instance
は関連付けられています。これは、他の方向から構築されるポリモーフィックな関連付けであるため、構築は複雑です)。
今私は得る:
undefined method `build_with_component_instance' for #<Class:0x1151dcae8>
スコープを調べると、私が見つけた唯一の違いは、proxy_scope
によって作成されたスコープを呼び出すin_context()
と、2.3.17 の Page モデルと 2.3.5 のスコープが返されることです。
ここからどこへ行けばいいのかわからない。関連付けに基づいて決定を下す必要があるため、スコープをモジュールに抽出して各モデルに含めることはできませんproxy_owner
。
更新:スコープのコンテキスト内で使用できない拡張メソッドに問題があるようです。かなり奇妙ですが、それは理にかなっていると思います。残念ながら、スコープ定義とビルド拡張機能の両方で、関連付けコンテキストの知識が必要です。どんなアイデアも歓迎します:)