Rails-有许多,带有查询的get-all嵌套和父对象



我一直在开发一个日程安排应用程序,在找到有效获取特定记录的方法时遇到了问题。

以下是有问题的模型。

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,但昨天我无法理解这个查询。

任何见解都将是有益的,我们将不胜感激。

您需要的是一个左外部联接。但是,如果您有WHERE子句,这将过滤掉联接失败的结果,请参阅Left join With 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)

最新更新