这个问题的背景非常复杂和令人费解,当我正在寻找一个简单的答案时,我将在解释我的问题时将其搁置一边,而是提供这种假设情况。
如果我有一个名为汽车的简单 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_scopes的插件,并且在这方面我遇到了一些阻力。我目前正在使用以下内容来合并这些范围:
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,那么我将能够引入一些更强大的合并逻辑。对此的任何想法将不胜感激。谢谢。