Как вы выполняете запрос or
в Rails 5 ActiveRecord? Кроме того, возможно ли цепочка or
с where
в запросах ActiveRecord?
Rails 5: запрос ActiveRecord OR
Ответ 1
Возможность привязать предложение or
вместе с предложением where
в ActiveRecord
запросе будет доступна в Rails 5. См. Обсуждение и запрос на перенос.
Итак, вы можете сделать следующее в Rails 5:
Чтобы получить post
с id
1 или 2:
Post.where('id = 1').or(Post.where('id = 2'))
Некоторые другие примеры:
(A & B) || C:
Post.where(a).where(b).or(Post.where(c))
(A || B) && C:
Post.where(a).or(Post.where(b)).where(c)
Ответ 2
Нам не нужно ждать, пока рельсы 5 будут использовать этот запрос OR
. Мы также можем использовать его с rails 4.2.3
. Существует backport здесь.
Благодарим Eric-Guo за gem where-or. Теперь мы можем добавить этот OR
функциональность в >= rails 4.2.3
, также используя этот камень.
Ответ 3
Мне нужно было сделать (A && B) || (C && D) || (E && F)
Но в текущем состоянии Rails 5.1.4
это слишком сложно выполнить с помощью Arel or-chain.
Но я все еще хотел использовать Rails для создания как можно большего количества запроса.
Итак, я сделал небольшой взлом:
В моей модели я создал частный метод под названием sql_where
:
private
def self.sql_where(*args)
sql = self.unscoped.where(*args).to_sql
match = sql.match(/WHERE\s(.*)$/)
"(#{match[1]})"
end
Далее в моей области я создал массив для хранения OR
scope :whatever, -> {
ors = []
ors << sql_where(A, B)
ors << sql_where(C, D)
ors << sql_where(E, F)
# Now just combine the stumps:
where(ors.join(' OR '))
}
Что приведет к ожидаемому результату запроса:
SELECT * FROM `models` WHERE ((A AND B) OR (C AND D) OR (E AND F))
.
И теперь я могу легко объединить это с другими областями и т.д. без каких-либо противоправных ИЛИ.
Красота заключается в том, что мой sql_where принимает обычные аргументы where-where:
sql_where(name: 'John', role: 'admin')
будет генерировать (name = 'John' AND role = 'admin')
.
Ответ 4
(Просто дополнение к ответу К. М. Ракибула Ислама).
Используя области действия, код может стать красивее (в зависимости от взгляда глаз):
scope a, -> { where(a) }
scope b, -> { where(b) }
scope a_or_b, -> { a.or(b) }
Ответ 5
Rails 5 имеет возможность or
пункт с where
. Например.
User.where(name: "abc").or(User.where(name: "abcd"))