尝试使用 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/