выбирать столбцы таблицы, только если она соответствует определенным условиям - PullRequest
0 голосов
/ 16 октября 2019

Rails 5.2 ruby ​​2.6

Привет всем,

У меня есть модель со столбцами status и updated_at made_at (также есть несколько других столбцов). Возможные значения состояния: «Ожидание», «На маршруте», «Завершено».

Я хочу запросить таблицу так, чтобы:

  • Все записи должны иметь статус «Ожидание»,По маршруту и ​​Завершено.
  • Если статус «завершен», то его updated_at должен быть в течение последних 24 часов.
    • Не следует выбирать все остальные записи со статусом «завершено» с разными временными метками.
@result =
  Model1.includes(Model2: [:model3, :model4, :model5, :model6])
        .where(conditions)
        .where('Model1.status = ? AND Model1.updated_at > ?', 'Completed', 24.hours.ago)
        .order('Model1.created_at DESC') 

Выше приведен пример структуры активной записивыполнение запроса. Этот запрос печатает только завершенные в течение последних 24 часов. но все остальные статусы не собираются.

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Так что вам в основном нужно это:

Model.where('Completed', 24.hours.ago)
     .or(Model.where(status: ['pending', 'enroute']))
1 голос
/ 16 октября 2019
includes(Model2: [:model3, :model4, :model5, :model6])
               .where(conditions)
               .where('(Model1.status = ? AND Model1.updated_at > ?) OR ( Model1.status != ?)', "Completed", 24.hours.ago, "Completed")
               .order('Model1.created_at DESC')
0 голосов
/ 16 октября 2019

Вы можете сделать следующее,

Model.where('Model1.status = ? AND Model1.updated_at > ?', 'Completed', 24.hours.ago)
     .or(Model.where(status: ['pending', 'enroute']))

Или вы можете пройти через Arel,

model = Model.arel_table
arel1 = model[:status].eq('Completed').and(model[:updated_at].gteq(24.hours.ago))
arel2 = model[:status].in(['pending', 'enroute'])

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