sql - 如何将 "DISTINCT ON"与Arel/ActiveRecord结合使用?

标签 sql ruby-on-rails activerecord arel distinct-on

我有一个 Message ActiveRecord 模型,我想选择具有不同 conversation_partner_id 的所有消息。我目前将 DISTINCT ON 子句指定为字符串,但我想知道是否可以将其作为 Arel 表达式提供,以及是否会有好处。我的声明如下:

Message.select('DISTINCT ON ("messages"."conversation_partner_id") messages.*').from(t)

其中 tmessages 表的并集,并指定为稍微复杂的 Arel 表达式。我将其省略,因为它独立于 SELECT 问题并且工作得很好。

以下代码不起作用工作:

Message.select([
  Arel::Nodes::DistinctOn.new(Message.arel_table[:conversation_partner_id]),
  Message.arel_table[Arel.star]
]).from(t)

它会导致 SQL 格式错误,因为它在 DISTINCT ON () 子句后面放置了一个逗号:

SELECT DISTINCT ON ("messages"."conversation_partner_id"), "messages".* ...
                                                         ^

最佳答案

如果你尝试这样做:

Message.arel_table
       .project(Arel.star)
       .distinct_on(Message.arel_table[:conversation_partner_id])
       .to_sql

你得到这个:

SELECT DISTINCT ON ( \"messages\".\"conversation_partner_id\" ) * FROM ...

关于sql - 如何将 "DISTINCT ON"与Arel/ActiveRecord结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167079/

相关文章:

mysql - Order by 使 mysql 变慢

c# - 如何在数据库表中添加刚刚删除的ID

ruby-on-rails - 渲染:new not going to the right place after a validation

ruby-on-rails-3 - 多对多关系的事件记录查询

ruby-on-rails - 如何在 ActiveRecord 最小值中以安全的方式插入参数

mysql - 使用 MySQL 存储过程从结果集中选择唯一值

sql - 最有效的检索sql

ruby-on-rails - 无法使用 PostGIS/RGeo 保存多边形

ruby-on-rails - Rails 中的默认 getter 和 setter 是什么样子的?

ruby-on-rails - 在 Rails 4 中验证循环关联的正确方法是什么?