Объединение двух разных таблиц, где user_id равен и create_at между двумя датами - PullRequest
0 голосов
/ 04 февраля 2020

В моем приложении у меня есть 3 модели User, Visit, Post. Чего я хочу добиться - это выбрать visits & posts, который принадлежит user, где created_at находится между 2 датами и group их к day (я использую groupdate для group_by_day) и вернуть count на visits & posts за этот день.

Я попробовал несколько без удачи:

User.joins(:visits,:posts).where("visits.user_id = ?, posts.user_id = ?", current_user.id, current_user.id)
    .where("visits.created_at >= ? AND visits.created_at <= ?", 15.days.ago.midnight.in_time_zone("Berlin"), 2.days.ago.midnight.in_time_zone("Berlin"))
    .where("posts.created_at >= ? AND posts.created_at <= ?", 15.days.ago.midnight.in_time_zone("Berlin"), 2.days.ago.midnight.in_time_zone("Berlin"))
    .group_by_day(:created_at, range: 15.days.ago.midnight.in_time_zone("Berlin")..Time.now.in_time_zone("Berlin"), format: "%d %b")
    .count

Это дало мне: ActiveRecord::StatementInvalid

SQLite3::SQLException: row value misused: SELECT COUNT(*) AS count_all, strftime('%Y-%m-%d 00:00:00 UTC', "users"."created_at") AS strftime_y_m_d_00_00_00_utc_users_created_at FROM "users" INNER JOIN "visits" ON "visits"."user_id" = "users"."id" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE (visits.user_id = 1, posts.user_id = 1) AND (visits.created_at >= '2020-01-20 00:00:00' AND visits.created_at <= '2020-02-02 00:00:00') AND (posts.created_at >= '2020-01-20 00:00:00' AND posts.created_at <= '2020-02-02 00:00:00') AND ("users"."created_at" >= '2020-01-20 00:00:00' AND "users"."created_at" <= '2020-02-04 19:03:28.383850') GROUP BY strftime('%Y-%m-%d 00:00:00 UTC', "users"."created_at")

Мои модели:

class Visit < ApplicationRecord
  belongs_to :user
end

class Post < ApplicationRecord
    belongs_to :user
end

class User < ApplicationRecord
  has_many :visits
  has_many :posts
end

Я искал вокруг и попробовал несколько разных способов без удачи. Любые рельсы помогают просто обычный sql или наконечник высоко ценится и заранее спасибо!

1 Ответ

1 голос
/ 05 февраля 2020

Попробуйте это:

_start_time = 15.days.ago.midnight.in_time_zone("Berlin") ## get start time
_end_time = 2.days.ago.midnight.in_time_zone("Berlin") ## get end time

 #### query ###
User.joins(:visits, :posts).where(visits: { created_at: (_start_time.._end_time) }).where(posts: { created_at: (_start_time.._end_time) }).group_by_day(:created_at, range: _start_time..Time.now.in_time_zone("Berlin"), format: "%d %b").count
...