将 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')
Box
、joins(:stones)
和 joins(:papers)
当然只有当您正确设置了 ActiveRecord 模型和关联时才有效。根据您在模型中设计关联的方式,您可能需要在 joins
中使用单数而不是复数。在遵循常见的 Rails 约定时,语句其他部分中的 table 名称应始终为复数形式。
我想将此查询转换为活动记录语句,以更 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')
Box
、joins(:stones)
和 joins(:papers)
当然只有当您正确设置了 ActiveRecord 模型和关联时才有效。根据您在模型中设计关联的方式,您可能需要在 joins
中使用单数而不是复数。在遵循常见的 Rails 约定时,语句其他部分中的 table 名称应始终为复数形式。