活动记录中的.where
可以将方法作为参数吗?
def not_foo?
name != "foo"
end
以下代码不起作用,但您会看到我的意思:
array.where(|element| element.not_foo?).count
答案 0 :(得分:3)
活动记录中的.where可以将方法作为参数吗?
答案:不,它不能。可能你想这样做
array.where.not(name: 'foo').count
答案 1 :(得分:2)
传递方法作为参数,即功能范例。在Ruby中,由closures
实现。
Closures
可以通过blocks
,lambdas
,procs
在Ruby中实现。
答案 2 :(得分:1)
你在这里混合了几个不同的概念。
您不能像在C或其他语言中那样在Ruby中“将方法作为参数传递”。您可以传递block
作为参数,非常不同。
在您的示例中,将首先评估element.not_foo?
。您将该评估的结果传递给where
。但是,您的代码中存在一些问题,甚至无法运行:
not_foo?
的定义接收一个参数(def nor_foo?(v)
),但你没有传递,这会引发ArgumentError: wrong number of arguments (0 for 1)
异常。
您正在错误地使用块参数语法(|element|
)。无论如何,ActiveRecord的where
不接受阻止。