Запрос для всех записей со статусом плюс последняя (независимо от статуса) в одном запросе - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть что-то вроде:

(Model.where(status: :active).to_a << Model.last).uniq

Я ищу способ, чтобы это произошло в одном запросе.Это возможно?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Вы можете создать запрос с простым SQL, а затем использовать ActiveRecord#find_by_sql для получения массива объектов ActiveRecord:

query = <<-SQL
  SELECT * FROM subscriptions
  WHERE
   status = 'active' OR
   id = (SELECT max(id) FROM subscriptions)
SQL

Subscription.find_by_sql(query) #=> [ array of subscriptions]

Если вам нужен экземпляр ActiveRecord :: Relation, используйте метод ActiveRecord#from.Это позволяет передавать простой SQL в оператор FROM.Так как #from возвращает отношение, вы можете использовать все методы Active Record для запроса

Subscription.from(query).where('created_at > ?', Time.zone.now)

. Он строит один запрос следующим образом:

SELECT * FROM (
  SELECT * FROM subscriptions
  WHERE
   status = 'active' OR
   id = (SELECT max(id) FROM subscriptions)
) WHERE created_at > '2019-01-01 00:00'
0 голосов
/ 10 февраля 2019

Я не думаю, что вы можете использовать один запрос, может быть, вы можете сделать запрос с вложенным подзапросом, но вы не можете сделать это просто с помощью ActiveRecord (может быть, с Arel).

Лично,Я бы использовал 2 запроса ActiveRecord, один для получения идентификатора записи las, а затем фактический запрос:

last_id = Model.last.id
records = Model.where(status: active).or(Model.where(id: last_id))

У вас будет 2 запроса, но первый будет действительно амортизируемым, а второй - многобыстрее, чем превратить все результаты в массив и выполнить uniq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...