将 postrgreSQL 查询转换为 ActiveRecord

translate postrgreSQL query to ActiveRecord

我想将此查询转换为活动记录语句,以更 rails 的方式完成工作,尽管它可以像 ActiveRecord::Base.connection.execute

一样执行

一直在努力实现它,任何帮助将不胜感激!

使用新的 postgresql 查询编辑以翻译:

SELECT DISTINCT ON (p.id) b.id
FROM boxes AS b
INNER JOIN stones AS s
  ON s.id = b.stone_id
INNER JOIN papers AS p
  ON p.id = s.paper_id
ORDER BY p.id, b.created_at DESC

或者这个是等效的,但我认为翻译起来更复杂:

with x as (
select row_number() over (partition by p.id order by b.created_at desc) 
as rn,b.id as id_box,p.id as id_paper
from boxes b join stones s on b.stone_id = s.id
join papers p on p.id = s.paper_id)
select x.id_box from x where rn = 1

distinct on 不支持 ActiveRecord 中的专用方法,因此您必须更详细:

Box
  .select('distinct on (papers.id) boxes.id')
  .joins(stones: :papers)
  .order('papers.id, boxes.created_at DESC')

Boxjoins(:stones)joins(:papers) 当然只有当您正确设置了 ActiveRecord 模型和关联时才有效。根据您在模型中设计关联的方式,您可能需要在 joins 中使用单数而不是复数。在遵循常见的 Rails 约定时,语句其他部分中的 table 名称应始终为复数形式。