Как выполнять запросы Rails в нескольких диапазонах дат (недель) - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь перебрать каждую неделю календарного года и выполнить запрос.

range = Date.new(2020,3,16)..Date.new(2020,3,22)
u = User.where(created_at: range).count

Но я бы хотел сделать это для КАЖДОЙ недели в другом диапазоне (скажем, с начала этого года).

Ruby Date имеет функцию cweek, которая дает вам номер недели, но, кажется, нет способа легко перейти от номера недели к диапазону дат.

В любом случае, не уверен, насколько полезным будет cweek, так как мне нужна неделя для пробега воскресенье -> суббота.

Мысли?

1 Ответ

1 голос
/ 24 марта 2020

Я предполагаю, что это Postgres, а название модели - Пользователь, основываясь на вашем предыдущем вопросе.

Если этот блог считается верным , вы можете изменить дату на один день чтобы получить солнечную дневную неделю.

User.group("(date_trunc('week', created_at::date + 1)::date - 1)")
    .count

Если вы хотите, чтобы фактический номер недели выбирался у вас, вы можете выбрать необработанные данные из базы данных вместо использования ActiveRecord :: Calculations # count , что довольно ограничено.

class User
  # @return [ActiveRecord::Result] 
  #  the raw query results with the columns count, year, week
  def self.count_by_biblical_week
    connection.select_all(
      select(
        "count(*) as count",
        "date_part('year', created_at)::integer as year",
        "(date_part('week', created_at::date + 1) - 1)::integer as week"
      ).group(:week, :year) 
    )
  end
end

Использование:

results = User.where(created_at: Date.new(2020,3,16)..Date.new(2020,3,22))
              .count_by_biblical_week
results.each do |row|
  puts  [row[:year], row[:week], row[:count]].join(' | ')
end

Добавление года в группу позволяет избежать двусмысленности, если результаты охватывают несколько лет.

...