【发布时间】: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