gpt4 book ai didi

ruby-on-rails - 优雅的 PostgreSQL Group by for Ruby on Rails/ActiveRecord

转载 作者:行者123 更新时间:2023-11-29 11:14:45 25 4
gpt4 key购买 nike

尝试使用 PostgreSQL 检索按日期分组的 ActiveRecord 对象数组。

更具体地说,我正在尝试翻译以下 MySQL 查询:

@posts = Post.all(:group => "date(date)", 
:conditions => ["location_id = ? and published = ?", @location.id, true],
:order => "created_at DESC")

我知道 PostgreSQL 对 SQL 标准的解释比 MySQL 更严格,因此这种类型的查询将不起作用......并且已经阅读了 StackOverflow 和其他地方关于该主题的许多帖子 - 但没有一个似乎是这个问题的最终答案

我已经尝试了各种查询与 group by 和 distinct 子句的组合,但没有太大的乐趣 - 目前我有一个相当不优雅的 hack,虽然它的工作让我在看到它时脸红。

使用 Rails 和 PostgreSQL 进行此类查询的正确方法是什么? (忽略了这肯定应该在 ActiveRecord 级别抽象掉的事实)

最佳答案

您要在此处使用的 PostgreSQL 功能是 DISTINCT ON .有两种基本方法可以通过 ActiveRecord 进行此查询。

第一种方法是只指定:select:order 选项。当您有一个没有 :joins:include 的相当简单的查询时,这非常有用。

Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)

如果您有一个更复杂的查询,其中 ActiveRecord 生成自己的 SELECT 子句,您可以使用子查询来选择目标记录。

Post.all(
:joins => 'INNER JOIN (SELECT DISTINCT ON (date::date) id FROM posts ORDER BY date::date DESC, created_at DESC) x ON x.id = posts.id'
)

请注意,根据您的数据,这可能比第一种方法慢一点。我只会在需要时使用此方法。请务必使用类似生产的数据进行基准测试。

关于ruby-on-rails - 优雅的 PostgreSQL Group by for Ruby on Rails/ActiveRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3512286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com