我有一个像这样的命名范围:
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, ...)
所以,我的问题真的是,如何将数组转换成逗号分隔的参数列表?
UPDATE0
从Martin Fowler我学到了:
(在参数列表中使用“*”有助于处理ruby中的变量参数。在参数列表中* disks表示vararg。然后我可以将所有传入的磁盘称为名为“disks”的数组。如果我用“* disks”调用另一个函数,则磁盘数组的元素将作为单独的参数传入。)
UPDATE1
更多关于the "splat" operator。
答案 0 :(得分:19)
*items
表示该函数接受可变数量的参数。换句话说,如果你这样称呼它:
Order.by_items(item0, item1, item2)
命名范围内的变量items
lambda函数将是一个包含3个项目的数组。
要回答真正的问题,您应该这样称呼它:
Order.by_items(*Item.find(:all, ...))