Я хочу сделать запрос, когда результаты будут добавлены в массив, например:
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]
?
Обратите внимание, используя:
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, и он станет уродливым, потому что вам понадобятся три подзапроса (из того, что я вижу).
Альтернативным решением было бы использовать оператор SQL UNION
для объединения трех разных наборов записей, отфильтрованных разными метками времени. Вы можете прочитать, как добиться такого результата в этом сообщении: ActiveRecord Query Union
select
, вам нужно три подзапроса.