2009-05-19 70 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]。