我不知道这是怎么实现的,当你做这样的事情:如何接受一个没有大括号的数组?
Model.where(["subjects = ?", 1])
Rails允许你省略括号:
Model.where("subjects = ?", 1)
我知道这是可能的哈希值,但如何是否有可能,所以你可以传递任意数量的参数(如果你愿意,你可以有100个问号),Rails仍然可以把它解释为一个数组?
我不知道这是怎么实现的,当你做这样的事情:如何接受一个没有大括号的数组?
Model.where(["subjects = ?", 1])
Rails允许你省略括号:
Model.where("subjects = ?", 1)
我知道这是可能的哈希值,但如何是否有可能,所以你可以传递任意数量的参数(如果你愿意,你可以有100个问号),Rails仍然可以把它解释为一个数组?
在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)
条款。
更复杂的答案是,rails并不真正将'Model.where(“subjects =?”,1)'作为一个数组来处理。相反,它是一种复杂签名方法,允许您传递许多不同类型的参数。它有点像'where(str_or_array = nil,* args,hash = {})' – max
从Docs
Model.where(array)
如果数组传递,那么该阵列的第一个元素被视为一个模板,而其余的元件被插入到模板以产生的条件。 Active Record负责构建查询以避免注入攻击,并且会根据需要从ruby类型转换为数据库类型。元素按照它们出现的顺序插入到字符串中。
User.where(["name = ? and email = ?", "Joe", "[email protected]"])
# SELECT * FROM users WHERE name = 'Joe' AND email = '[email protected]';
你想写条件与多个主题ID吗? –