2009-05-19 73 views
2

下面的例子:如何从命名范围扩展中访问named_scope参数?

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扩展的参数。有没有办法做到这一点?

更具体的例子:

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

您发布的代码有两个块,并且不会按预期工作。 如果需要将参数作为参数,您将不能访问参数吗? 你能更具体地说明你正在努力完成什么吗?它的工作原理是 – nessence 2009-05-19 11:03:44

+0

。请参阅:http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality - >命名范围扩展 – spas 2009-05-19 13:28:00

回答

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然后我会做,在拉姆达。

Named_scope结果将始终是一个结果,就像您使用Model.find一样。这是一个rails的功能,所以如果你想要一些不同的东西,你需要用一个Module重写rails功能。我不会推荐这么做,因为named_scope扩展名用于简化查找器,而不是观察参数。

+0

新示例应该使其更清晰 – spas 2009-05-19 13:34:00

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]。