5

私はMessageActiveRecord モデルを持っており、異なる を持つすべてのメッセージを選択したいと考えていますconversation_partner_idDISTINCT ON現在、句を文字列として指定していますが、Arel代わりに式として提供できるかどうか、および利点があるかどうか疑問に思っていました。私の声明は次のようになります。

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

wheretmessagesテーブルの和集合であり、やや複雑な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".* ...
                                                         ^
4

1 に答える 1

5

これを試してみると:

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

あなたはこれを得る:

SELECT DISTINCT ON ( \"messages\".\"conversation_partner_id\" ) * FROM ...
于 2016-07-18T09:19:03.760 に答える