我有一个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)

由于在DISTINCT ON ()子句后放置逗号,因此会导致SQL格式错误:
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/

10-11 06:35