Где запрос ActiveRecord возвращает пустое AssociationRelation

0

Я хочу сделать запрос, когда результаты будут добавлены в массив, например:

приложение/модели /user.rb

query = self.patients.where(["created_at >= ? and created_at >= ? and created_at >= ?", Time.zone.now.beginning_of_day, Time.now.beginning_of_week, Time.now.beginning_of_month]).to_a

Ожидаемый результат:

query
=> [3, 5, 12]

Текущий результат:

Patient Load (0.8ms)  SELECT 'patients'.* FROM 'patients' WHERE 'patients'.'medic_id' = 1 AND (created_at >= '2018-07-20 00:00:00' and created_at >= '2018-07-16 05:00:00' and created_at >= '2018-07-01 05:00:00')
=> #<ActiveRecord::AssociationRelation []>

without to_a method => [#<ActiveRecord::AssociationRelation []>]
with to_a method => []

модели

class User < ApplicationRecord 
  has_many :patients, dependent: :destroy
end

class Patient < ApplicationRecord
  belongs_to :user
end

Я получаю пустой массив /AssociationRelation, как я могу получить массив со счетом пациентов для начала дня, недели, месяца, как этот query = [3, 5, 12]?

Обратите внимание, используя:

  • Mysql: Ver 15.1 Распространение 10.1.34-MariaDB для Linux (x86_64) с использованием readline 5.1
  • Рубин: 2.3.3p222
  • Rails: 5.0.0.1
  • ActiveRecord: 5.0.0.1
  • 2
    Это не то, как работает ActiveRecord. Вы не можете вернуть эти значения с помощью одного select , вам нужно три подзапроса.
Теги:
activerecord

2 ответа

2

Решение:

class Patient < ApplicationRecord
  scope :created_since, -> (time) { where('created_at >= ?', time) }
  # ...
end

Пример:

как я могу получить массив со счетом пациентов для начала дня, недели, месяца, как этот запрос = [3, 5, 12]?

patients_counts = [
  Patient.created_since(Time.zone.now.beginning_of_day).count,
  Patient.created_since(Time.zone.now.beginning_of_week).count,
  Patient.created_since(Time.zone.now.beginning_of_month).count,
]

puts patients_counts
# => [3, 5, 12]
  • На всякий случай, если вы не знаете, вы также можете сделать это: @user.patients.created_since(...)

PS Я не предлагаю делать в одном запросе, и просто делаю три отдельных запроса count, как описано выше. Вы можете сделать это в одном запросе, но вам придется написать очень специфический SQL, и он станет уродливым, потому что вам понадобятся три подзапроса (из того, что я вижу).

  • 1
    Почему бы не использовать один прицел и скоротать время?
  • 0
    @ user3334690 ааа, ты совершенно прав! : D
Показать ещё 8 комментариев
0

Альтернативным решением было бы использовать оператор SQL UNION для объединения трех разных наборов записей, отфильтрованных разными метками времени. Вы можете прочитать, как добиться такого результата в этом сообщении: ActiveRecord Query Union

Ещё вопросы

Сообщество Overcoder
Наверх
Меню