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

标签 ruby-on-rails postgresql activerecord

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

相关文章:

ruby-on-rails - Ruby 中数组的深拷贝

css - Twitter Bootstrap form-inline Not Lining Controls Up

node.js - Mongoose:模式与模型?

sql - rails postgresql。两个操作的碰撞

sql - 使用 Postgres 解析字符串化的 JSON 对象

ruby - 使用 find_by_sql 复制包含和连接行为(单个查询建立关联)

ruby-on-rails - 在产品购买时将多条记录添加到数据库

ruby-on-rails - 关于 Rails 上的 SQLite3 的困惑

sql - 在 rails_admin 关联中更改类似查询

ruby-on-rails - 查找表的 Rails 关联