この問題の背景は非常に複雑で入り組んでおり、簡単な答えを探しているので、問題を説明する際にそれを脇に置き、代わりにこの仮説的な状況を提供します。
Automobile と呼ばれる単純な ActiveRecord モデルがあり、named_scopes が以下のようになっているとします。
named_scope :classic, :conditions => { :build_date <= 1969 }
named_scope :fast, lambda { |speed| :top_speed >= speed }
私が呼び出す場合、スコープ自体を無視します。
Automobile.scopes
これは正確に何を返すのでしょうか?コンソールに表示されるのは次のとおりです。
[ :classic => #<Proc:0x01a543d4@/Users/user_name/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/named_scope.rb:87>,
:fast => #<Proc:0x01a543d4@/Users/user_name/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/named_scope.rb:87> ]
これは、キーと値の配列のように思えます。キーは名前付きスコープのシンボルであり、値は ActiveRecord の named_scope.rb ファイルを指す Proc です。
実際の名前付きスコープとして与えられたハッシュまたは Proc が必要な場合 (:classic の場合、「:conditions => { :build_date <= 1969 }」を受け取ることになります)、どうすればこれを見つけることができますか?
いくつかのnamed_scopeを条件付きでマージするプラグインを書いていますが、これに関して抵抗があります。現在、これらのスコープをマージするために以下を使用しています。
scopes_to_use = Automobile.scopes
scoped_options = {}
Automobile.scopes.each do |scope|
scoped_options.safe_merge!(eval "Automobile.#{scope}(self).proxy_options")
end
ここで行っていることの「正確さ」を無視して、named_scope に与えられた実際の Hash または Proc を取得できるより良い方法はありますか? この関数で「eval」を使用するのは好きではありません。実際に Hash または Proc を取得できれば、より強力なマージ ロジックを導入できるでしょう。これについての考えは大歓迎です。ありがとう。