Пользовательский запрос с Squeel на равенство двух атрибутов упорядоченным парам - PullRequest
2 голосов
/ 23 февраля 2012

Мне трудно написать запрос, будь то в 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], и я боюсь, что он не будет использовать этот индекс, что будет требованием для меня.

Есть ли более простой способ написания этих составных областей? Спасибо!

...