我不知道這是怎麼實現的,當你做這樣的事情:如何接受一個沒有大括號的數組?
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嗎? –