【发布时间】:2016-03-18 15:14:56
【问题描述】:
我不知道如何在不使用 Ruby 进行映射/选择等的情况下实现以下规范,并尝试尽可能多地使用 SQL。
我的“公司”有很多“员工”。
公司的一名员工被标记为“联系人”(布尔字段)。映射到范围contact_points。
公司也有很多“订单”。
挑战是查询某个时间段内的所有联络点员工,并返回公司在此期间下达第一笔订单的员工。
因此,这是查找订单的最短 created_at 时间的组合,按 company_id 分组,然后返回公司寻找联络点员工。 (我认为)。
经过大量尝试使用纯 ActiveRecord/SQL 解决方案的喘息和喘息之后,我求助于这个。
Employee
.contact_points
.joins(:company)
.where(
companies: {
id: Order.all.group_by(&:company_id)
.map{ |o| o.last.sort{ |a,b| a.created_at <=> b.created_at }.first }
.keep_if{ |o| (date_from..date_to).cover?(o.created_at) }
.map(&:company_id)
}
)
date_from 和 date_to 是从报告表单中删除的日期参数。
我希望有办法简化这个?
【问题讨论】:
标签: ruby-on-rails ruby postgresql activerecord