Ruby on rails Rails中的ActiveRecord查询
我不知道如何在不使用Ruby进行映射/选择等操作的情况下实现以下规范,并尽可能多地使用SQL 我有很多“员工”的“公司” 公司的一名员工被标记为“联系人”(布尔字段)。映射到接触点的范围 公司也有很多“订单” 挑战在于查询一段时间内的所有联系人员工,并返回在该时间段内第一次下单的公司员工 因此,这是一种组合,即查找在时间为订单创建的最小Ruby on rails Rails中的ActiveRecord查询,ruby-on-rails,ruby,postgresql,activerecord,Ruby On Rails,Ruby,Postgresql,Activerecord,我不知道如何在不使用Ruby进行映射/选择等操作的情况下实现以下规范,并尽可能多地使用SQL 我有很多“员工”的“公司” 公司的一名员工被标记为“联系人”(布尔字段)。映射到接触点的范围 公司也有很多“订单” 挑战在于查询一段时间内的所有联系人员工,并返回在该时间段内第一次下单的公司员工 因此,这是一种组合,即查找在时间为订单创建的最小,按公司id分组,然后返回公司查找联系人员工。(我想) 在尝试使用纯ActiveRecord/SQL解决方案时,我大发雷霆,终于求助于此 员工 .联络点 .加入(
,按公司id
分组,然后返回公司查找联系人员工。(我想)
在尝试使用纯ActiveRecord/SQL解决方案时,我大发雷霆,终于求助于此
员工
.联络点
.加入(:公司)
.在哪里(
公司:{
id:Order.all.group\u by(&:company\u id)
.map{o|o.last.sort{a,b|a.created_at b.created_at}.first}
如果{o{o}(日期从..日期到)。封面(o.created在)}
.map(&:公司id)
}
)
date\u from
和date\u to
是从报表中删除的日期参数
我希望有一种方法可以简化这个过程。请参考链接
从(clients.orders\u count IN(1,3,5))的客户机中选择*您当前的方法将所有订单都存储到内存中,这将是缓慢而粗糙的。我会这样做:
Employee
.contact_points
.joins(:company)
.where(<<-EOQ, date_from, date_to, date_from)
EXISTS (SELECT 1
FROM orders o
WHERE o.company_id = companies.id
AND o.created_at BETWEEN ? AND ?)
AND NOT EXISTS (SELECT 1
FROM orders o
WHERE o.company_id = companies.id
AND o.created_at < ?)
EOQ
因此,链接只是参考,代码行是答案?Paul,谢谢你,我使用了第二个示例,它非常有用!我感谢你的帮助。
Employee
.contact_points
.joins(<<-EOQ)
INNER JOIN (SELECT o.company_id, MIN(o.created_at) created_at
FROM orders o
GROUP BY company_id) min_orders
ON employees.company_id = min_orders.company_id
EOQ
.where("min_orders.created_at BETWEEN ? AND ?", date_from, date_to)