2009-05-19 9 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

投稿したコードには2ブロックあり、意図したとおりに動作しません。 パラメータとして必要な場合、どのようにしてargsにアクセスできませんか? 達成しようとしていることを具体的にすることはできますか? – nessence

+0

が動作します。参照:http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality - >名前付きスコープ拡張 – spas

答えて

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を使用した場合と同じ結果になります。これはレールの機能ですので、何か異なるものが必要な場合は、レール機能をモジュールでオーバーライドする必要があります。 named_scopeの拡張機能は、パラメータを監視するのではなく、ファインダを簡略化するために用意されているので、これを行うことはお勧めしません。

+0

新しい例では、それをより明確にする必要があります – spas

+0

ありがとう。私は追加の回答を掲載しました。私は解明として2番目の答えを投稿しました。私は最初にあなたが達成しようとしていたものではありません:) – nessence

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]にアクセスできます。

+0

それはうまく動作しますが、まだまだハックです;) – spas

+0

そして、あなたは条件としてハッシュを使用していない – spas

関連する問題