如何从命名范围扩展访问named_scope参数?

时间:2009-05-19 08:50:01

标签: ruby-on-rails

以下示例:

named_scope :search, lambda {|my_args| {...}} do
  def access_my_args
    p "#{my_args}"
  end
end

# Call:
Model.search(args).access_my_args

如您所见,我想从named_scope扩展中的lambda访问参数。有没有办法做到这一点?

更具体的例子:

class User < ActiveRecord::Base
  named_scope :by_name, lambda {|name_from_scope| {:conditions => {:name => name_from_scope}}} do
    def change_name
     each { |i| i.update_attribute(:name, "#{name_from_scope}xyz") }
    end
  end
end

(我知道有一个find_by_name范围等等......)。我想使用name_from_scope参数,该参数在范围扩展中的范围内传递。

2 个答案:

答案 0 :(得分:2)

named_scope :test_scope, lambda {|id| {:conditions => {:id => id}} } do
    def test_scope_method
      each {|i| puts @proxy_options.to_yaml}
    end
  end

我不相信你可以在不扩展activerecord的情况下直接获得参数。

@proxy_options将为您提供块中的已编译选项。因此,在您的示例中,您将无法访问name_from_scope,但您可以访问@proxy_options [:conditions] [:name]。

答案 1 :(得分:0)

这是你想要做的吗?

named_scope :search, lambda {|*my_args|
    OtherClass.announce_search_for_model(my_args, self.class)
    { :conditions => ['created_at < ?', my_args[:created_at]], :limit => my_args[:limit] }
}

args = {:created_at > 'NOW()', :limit => 5}
Model.search(args)

如果您想观察传入named_scope的内容,那么我会在lambda中执行此操作。

Named_scope结果将始终是您使用Model.find的结果。这是rails的功能,因此如果您需要不同的东西,则需要使用模块覆盖rails功能。我不建议这样做,因为named_scope扩展用于简化查找器,而不是观察参数。