説明をSQLに簡単に音訳すると、次のようになります。
select name, path, value
from (
select name, path, value,
row_number() over (partition by path order by value desc) as r
from your_table
where path is not null
) as dt
where r = 1
union all
select name, path, value
from your_table
where path is null
それをaでラップして、find_by_sql
オブジェクトを反対側に出すことができます。
そのクエリは次のように機能します。
row_number
ウィンドウ関数を使用すると、行をでグループ化し、path
各グループをで並べ替えてから、各グループの行に番号を付けることができますvalue
。SQLを少しpsql
試してみると、これがどのように機能するかがわかります。他にも、あらゆる種類のすばらしいことを実行できるウィンドウ関数があります。
path
NULL値をNULL以外の値とは別に扱っているpath
ためpath is not null
、内部クエリで。
path
派生テーブルから行番号が1(つまり)の行を選択することで、各グループの最初の行をはがすことができますwhere r = 1
。
- 行の処理は
path is null
、セクションクエリによって簡単に処理されます。
- UNIONは、クエリの結果セットを結合するために使用されます。
ActiveRecordを使用してそのようなクエリを構築する方法も、ActiveRecordのスコープメカニズムとそのようなクエリを統合する方法も考えられません。のWHEREコンポーネントだけに簡単にアクセスできる場合は、スコープチェーンのWHEREコンポーネントを使用して、そのクエリのコンポーネントとコンポーネントをActiveRecord::Relation
拡張できます。でもどうやってやるのかわからない。where path is not null
where path is null
実のところ、私は一瞬でActiveRecordを放棄する傾向があります。ActiveRecordは、私が行う複雑なことのほとんどにとってかなり面倒であり、SQLほど表現力がありません。これは私が今まで使用したすべてのORMに当てはまるので、問題はActiveRecordに固有のものではありません。