如何使用" DISTINCT ON"与Arel / ActiveRecord一起使用?

时间:2015-05-11 11:57:29

标签: 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".* ...
                                                         ^

1 个答案:

答案 0 :(得分:3)

如果您尝试这样做:

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

你明白了:

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