方法作为ActiveRecord`where`中每个实例的参数

时间:2016-03-03 01:03:30

标签: ruby activerecord

活动记录中的.where可以将方法作为参数吗?

def not_foo?
  name != "foo"
end

以下代码不起作用,但您会看到我的意思:

array.where(|element| element.not_foo?).count

3 个答案:

答案 0 :(得分:3)

  

活动记录中的.where可以将方法作为参数吗?

答案:不,它不能。可能你想这样做

array.where.not(name: 'foo').count

答案 1 :(得分:2)

传递方法作为参数,即功能范例。在Ruby中,由closures实现。

Closures可以通过blockslambdasprocs在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不接受阻止。