Rails - имеет много, с запросом получить все вложенные и родительские объекты - PullRequest
0 голосов
/ 21 ноября 2018

Я работал над приложением для планирования и столкнулся с проблемой поиска способа эффективного получения конкретных записей.

Вот модели, о которых идет речь.

class Task < ApplicationRecord
 belongs_to :user, optional: true
 belongs_to :project, optional: true
 belongs_to :project_schedule, optional: true
 belongs_to :user_schedule, optional: true

class User < ApplicationRecord
 include Filterable
 validates :email, presence: true
 validates :email, uniqueness: true
 has_many :tasks 

Внешний интерфейс ожидает, что json всех пользователей со всеми задачами, вложенными в них.Это стало слишком громоздким, чтобы загружать такое количество задач, и я пытался указать диапазон дат для этих задач, продолжая привлекать всех пользователей.

Так что это кажется более сложным, чем я первоначально ожидал.Я могу эффективно получить всех пользователей, все задачи в диапазоне дат и всех пользователей с задачами в заданном диапазоне дат с включенными задачами.Но получение всех пользователей с задачами, вложенными в определенный диапазон дат, ускользнуло от меня.

То, что я пробовал

User.filter(params.slice(:project_ids, :email, :id))
 .includes(:tasks).where('((tasks.end_date BETWEEN ? AND ?)
 OR (tasks.start_date BETWEEN ? AND ?))',
 week_start, week_end, week_start, week_end)
 .references(:tasks).order(:name)

Я также пытался объединить всех пользователей и всех пользователей с задачами.в пределах диапазона безрезультатно.

Я чувствую, что ключ - это неформатированный SQL, но вчера я не смог обернуть голову вокруг запроса.

Любое понимание будет полезным и ценимым.

1 Ответ

0 голосов
/ 22 ноября 2018

Вам нужно левое внешнее соединение.Однако, если у вас есть предложение WHERE, это отфильтрует результаты, для которых соединение не удалось, см. Оставленное соединение с предложением Where .

Необходимо указать условие как частьпредложение JOIN, что-то вроде этого:

User.filter(params.slice(:project_ids, :email, :id))
    .joins("LEFT OUTER JOINS tasks ON tasks.user_id = users.id AND 
            tasks.end_date BETWEEN :week_start AND :week_end OR 
            tasks.start_date BETWEEN :week_start AND 
            :week_end", week_start: week_start, week_end: week_end
    .includes(:tasks).order(:name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...