2009-11-10 19 views
17

私はこのような名前付きスコープを持っています:変数の前のアスタリスクは、named_scopeの引数リストで何を意味しますか?

named_scope :by_items, lambda |*items| { 
    :joins => :items, 
    :conditions => ["items.id in (?)", items.map(&::id)] 
} 

*itemとは何ですか?私はItem.find(:first, ...)でそれを呼び出すとき、それはうまく動作します。コレクションを使って呼び出すと、Item.find(:all, ...)は失敗します。

別のSOの質問から、私は署名があるはずです知っている:

Order.by_items(item0, item1, ...) 

だから、私の質問本当には、どのようにコンマ区切り引数リストに配列を有効にするのですか?私は学んだ:

私は学んだ:

(引数リストで "*"を使うと、Rubyで可変引数を扱うのに役立ちます。 "* disks"という名前の別の関数を呼び出すと、ディスク配列の要素が別々の引数として渡されます。)

UPDATE1

the "splat" operatorの詳細

答えて

18

*itemsは、関数が可変数の引数を受け入れることを意味します。言い換えれば、あなたはこのようにそれを呼び出す場合:

Order.by_items(item0, item1, item2) 

という名前のスコープラムダ関数内の変数itemsは3つのアイテムを配列になります。

があなたの本当の質問に答えるために、あなたはこのようにそれを呼び出す必要があります:魔法だ

Order.by_items(*Item.find(:all, ...)) 
+1

を! –

関連する問題