以下示例:
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参数,该参数在范围扩展中的范围内传递。
答案 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扩展用于简化查找器,而不是观察参数。