Мне трудно написать запрос, будь то в SQL или нет, но я бы хотел написать его в ruby, используя gem Squeel. В основном у меня есть класс:
class Article < ActiveRecord::Base
belongs_to :genre
belongs_to :publisher
...
end
Я хочу область, которая принимает массив упорядоченных пар в формате (genre_id, publisher_id)
и выводит ActiveRecord::Relation
, который содержит все записи с жанром, пары издателя, равные переданным парам.
По сути, я хочу Article.where{ genre_id.eq_any [1, 5, 76] }
, за исключением того, что вместо одного атрибута я хочу его для пары атрибутов:
Article.where{ genre_id_publisher_id.eq_any [(1,2), (1,4), (2, 4)] }
Единственный способ сделать это - создать область видимости с помощью вызова select, который добавляет столбец, который будет объединять два идентификатора с некоторым разделителем, а затем выполнять поиск на основе этого:
Article.select(*,
"#{genre_id}-#{publisher_id}" as genre_publisher_pair).where(
genre_publisher_pair.eq_any ["1-2", "1-4", "2-4"])
Тем не менее, это похоже на чрезмерные накладные расходы. У меня также уже есть составной индекс для [genre_id, publisher_id], и я боюсь, что он не будет использовать этот индекс, что будет требованием для меня.
Есть ли более простой способ написания этих составных областей? Спасибо!