使用活動記錄,我想執行一個查找,回傳具有所有匹配 id 的專案集合。
鑒于下面的示例匹配陣列中的任何 id,我試圖找出語法,以便在所有 id 匹配時匹配。(鑒于在本例中存在多對多關系)。
id 的陣列長度也是可變的,禁止鏈接 .where()
x.where(id: [1,2])
注意:這個問題之前被洗掉了,有很多關于執行 sql "where in" 的答案,但這個問題是關于執行 sql "where and"
uj5u.com熱心網友回復:
您可以使用exec_query和執行您自己的系結查詢:
values = [1, 2]
where_condition = values.map.with_index(1) { |_, index| "id = $#{index}" }.join(" AND ")
sql = "SELECT * FROM table WHERE #{ where_condition }"
binds = values.map { |i| ActiveRecord::Relation::QueryAttribute.new(nil, i, ActiveRecord::Type::Integer.new) }
ActiveRecord::Base.connection.exec_query(sql, nil, binds)
uj5u.com熱心網友回復:
我完全同意@muistooshort 的評論
where(id: [1,2])除非你加入關聯表,否則沒有意義,在這種情況下,......“where in”結合 HAVING [解決你的問題]。
但為了回答這個問題和假設,id只是作為例子。
雖然@SebastianPalma 的答案會奏效,但它會回傳一個,ActiveRecord::Result而大多數情況下,愿望是ActiveRecord::Relation.
我們可以通過使用像這樣Arel構建where子句來實作這一點:(我修改了示例以使用description而不是id使其更具邏輯意義)
table = MyObject.arel_table
values = ['Jamesla','Example']
where_clause = values.map {|v| table[:description].matches("%{v}%")}.reduce(&:and)
# OR
where_clause = table[:description].matches_all(values.map {|v| "%#{v}%"})
MyObject.where(where_clause)
這將導致以下 SQL 查詢:
SELECT
my_objects.*
FROM
my_objects
WHERE
my_objects.description LIKE '%Jamesla%'
AND my_objects.description LIKE '%Example%'
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/398132.html
標籤:红宝石轨道
上一篇:匯入的Scala專案沒有運行選項
下一篇:重構共同關注點中的共同模式
