2016-12-25 4 views
1

次のSQLをEcto Query DSLに変換する必要があります。 WHERE句の第三AND声明の中でEctoのすべてのクエリ

SELECT otc.* 
FROM users u 
INNER JOIN one_time_codes otc ON u.id = otc.user_id 
LEFT OUTER JOIN one_time_code_invalidations otci ON otci.one_time_code_id = otc.id 
WHERE u.id = 3 AND 
     otc.code = 482693 AND 
     otci.inserted_at IS NULL AND 
     otc.inserted_at > all(SELECT otc.inserted_at 
          FROM one_time_codes otc2 
          WHERE otc2.user_id = 3) AND 
     otc.inserted_at > (now() - '180 seconds'::interval); 

ALLクエリがあります注意してください。エクトはEcto.Query.APIに対応する機能を持たないようです。

このような集計を適用するにはどうすればよいですか?これを実装する正しい方法は何ですか?Ectoのデバッグログを参照することで実装できますが、別のアイデア(または提案)がありますか?

ありがとうございます。

答えて

1

そこにはallはエクトのクエリAPIでませんが、あなたがこのようなfragmentを使用することができることをエクトは、式中でサブクエリーを許可していない、とあなたは正しい:

where: ... 
    and otc.inserted_at > fragment("all(SELECT otc.inserted_at FROM one_time_codes otc2 WHERE otc2.user_id = ?", 3) 
    and ... 
+0

おかげで再び:)。スーパークエリのパラメータをフラグメントに渡すにはどうすればいいですか?たとえば、スーパークエリで見つかった結合クエリから 'User in u 'を参照する必要がありますか? – Leviathlon

+1

このようなことができますか? 'join:u in User、...、where:fragment("?=? "、u.id、10)'? – Dogbert

+0

うわー、きちんとした。ありがとうございました。 – Leviathlon

関連する問題