Rails присоединяется к запросу убитым или просто слишком медленным.Пожалуйста, порекомендуйте правильный способ создания запросов - PullRequest
0 голосов
/ 17 июня 2019

У меня проблемы с созданием запроса с объединениями. Он начинает общаться с сервером, но в итоге забивается и говорит «убит» (в консоли Rails)

Я должен к моделям.

Один - «Пользователь», другой - «Доступность»

Некоторые пользователи открывают доступность через 2 недели. И я хотел бы получить 50 пользователей с этим условием с помощью переменной страницы (потому что их будет много, и я хотел бы получить 50 при каждом вызове)

Доступность имеет два столбца: user_id и start_time (datetime)

И ассоциация заключается в том, что у пользователя много возможностей.

Запрос выглядит следующим образом.

people = User
 .where(role: SOMETHING)
 .includes(:availabilities)
 .joins(:availabilities)
 .where('availabilities.start_time > ?', Time.now)
 .where('availabilities.start_time < ?', Time.now + 2.weeks)
 .limit(5)
 .offset(50 * (n-1))

где n - целое число от 1

Тем не менее, этот запрос никогда не дает мне результата в производственной среде (в консоли он убит. До того, как консоль убивает процесс, при запросе он всегда показывает нормальный оператор запроса (например, 30 мс). В локальном, где данные маленький, это работает. Здесь чего-нибудь не хватает?

Пожалуйста, дайте мне любой совет !!

И странная вещь,

people = User
     .where(role: SOMETHING)
     .includes(:availabilities)
     .joins(:availabilities)
     .limit(5)
     .offset(50 * (n-1))

тогда если

people.map (&: id) => [18,18,18,18,18]

, что означает, что люди неправомерно забраны. Я просто запутался здесь ..!

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Я как-то нахожу способ это сделать:

people = User
  .where(role: ROLES)
  .joins(:availabilities)
  .where(availabilities: { start_time: (Time.now)..(2.weeks.from_now) })
  .distinct
  .offset(50 * (n-1))
  .limit(5)

Тогда:

people.map(&:id), => [x,y,z,l,m]
0 голосов
/ 17 июня 2019

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

Если строк доступности так много, это будет стоить много времени.

Если после запроса вы не воспользуетесь доступностью, попробуйте

people = User
 .where(role: ROLES)
 .joins(:availabilities)
 .where(availabilities: {start_time: (Time.now)..(2.weeks.from_now)})
 .offset(50 * (n-1))
 .limit(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...