.where如何接受没有括号的数组?

时间:2016-09-23 10:02:02

标签: ruby-on-rails

当你做类似的事情时,我不确定这是如何实现的:

$scope.dataProp = [$scope.data];

Rails允许你省略大括号:

Model.where(["subjects = ?", 1])

我知道哈希可以实现这一点,但是如何才能传递任意数量的参数(如果需要可以有100个问号),Rails仍然可以将其解释为数组?

2 个答案:

答案 0 :(得分:1)

在Ruby中,方法可以接受splat arguments

def foo(*a)
  a
end

foo('bar', 'baz')
# => ["bar", "baz"]

splat收集任何剩余的论点。您甚至可以使用常规参数:

def foo(a, *b)
  b
end

foo('bar', 'baz')
# => ["baz"]

您甚至可以执行以下操作:

def foo(*a)
  a.length == 1 && a.first.is_a?(Array) ? a.first : a
end

现在,调用foo('bar', 'baz')foo(['bar', 'baz'])具有相同的返回值。

但是,如果您想要的是WHERE条件,其中值可以是许多可能值中的一个,您可以这样写:

Model.where(foo: [1, 2, 3, 5])

哪会创建WHERE models.foo IN (1,2,3,5)子句。

答案 1 :(得分:0)

来自Docs

Model.where(array)

如果传递了数组,则将数组的第一个元素视为模板,并将其余元素插入模板以生成条件。 Active Record负责构建查询以避免注入攻击,并在需要时将ruby类型转换为数据库类型。元素按照它们出现的顺序插入到字符串中。

User.where(["name = ? and email = ?", "Joe", "joe@example.com"])
# SELECT * FROM users WHERE name = 'Joe' AND email = 'joe@example.com';