【问题标题】:Rails - Has many, with query get all nested and parent objectRails - 有很多,通过查询获取所有嵌套和父对象
【发布时间】:2018-11-21 17:49:53
【问题描述】:

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

这里是有问题的模型。

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)

我也尝试将所有用户和所有用户与范围内的任务合并,但无济于事。

我觉得 key 是原始 SQL,但昨天我无法理解查询。

任何见解都会有所帮助和赞赏。

【问题讨论】:

  • 该查询有什么问题?您的目标是“所有用户”并且只加载给定范围内的任务吗? (带条件的外部连接)如果是这样,可能只执行 2 个查询(一个用于用户,一个用于日期范围内的任务)然后在 UI 中统一它们。您使用什么版本的 rails 以及 rails 5 提供 left_joins 以及 or 语法选项?
  • 查询的问题是,当我的 UI 需要所有用户的列表时,我只获取具有日期范围内任务的用户。至于版本,我使用的是 rails 5。至于在 UI 上统一它们,这是我目前正在尝试的。当我第一次考虑这条路线时,我认为很难将任务与正确的用户对齐。

标签: sql ruby-on-rails ruby activerecord


【解决方案1】:

您需要的是左外连接。但是,如果您有 WHERE 子句,这将过滤掉连接失败的结果,请参阅 Left Join With Where Clause

您需要将条件指定为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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2018-01-28
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多