memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

メモ:ActiveRecord(というかSQL)で作りにくいデータがあったが対処療法的な方法で逃げた

やりたいこと・やってみたこと

研究ツール開発で、作っては改善している過程で以下のような要件が出てきました。

要件をテキストだけで説明するのは難しいので下図を使って説明します。

時系列データがあります。そのデータを表示するときに、ある事象のデータ(オレンジ)があれば最上部に表示し(もちろん無ければ表示しない)、それ以下に最新の1件を表示するという仕様です。

Railsで開発しているのでデータ操作にはActiveRecordクラスを使います。色々と考えてみたのですが、SQL文だけではどうも作れないことがわかりました(いや作れるよ、という方がいたら教えてください)。

to_aにして配列操作すればできそうでしたがなぜかうまく動作しませんでした。

とりあえず導き出した解法

とりあえず動いたのが以下でした。こういう使い方がいいのかわかりませんし。。。無駄なような気がするのですが。以下、擬似コードです。最新1件のデータbにオレンジのデータaが含まれている可能性がありますからからb-aで取り除きます。そしてその前にオレンジのデータaを付加すれば所望のデータが得られました。

a =  ActiveRecordでオレンジのデータを取得する記述
b =  ActiveRecordで時系列で降順にソートして最新の1件を取得する記述
@data = a + (b - a)

ActiveRecordクラスに対してこういう集合演算的な操作ができるという発想はなかったのですが、色々と試行錯誤しているときにto_aを使って配列にして差分を求めることができたので、もしかするとActiveRecordクラスでもできるのかな。。。と思いやったらできたということでした。

もっといい方法がありそうですが。。。ただ実行速度は別として、記述量は少ないのでわかりやすいなと思います。現場ではよくあるパターン(もしかするとアンチパターン?)かもしれませんが。とりあえず記録です。