ruby というか rails ネタを一つ。
(タイトルはあまり関係ありませんので、あしからず)
契約結婚は成立するのか?
AR で引っ張ってきたオブジェクトをいじらず、主テーブルの取得条件は変えずに
別の新しいオブジェクトを作りたかった話し。
(何でわざわざそんな事する必要があんの?とかは愚痴になりそうなのでさておき)
最初、以下のように IN 句 の id 列挙で引っ張っていたのだが、データが数万件に及ぶと
どうもパフォーマンスが出ない(返ってくるのに数十秒かかってたり)。
※ 実際は SQL ゴリゴリで書いてるせいで ids も取れなくて WTF! とかつぶやいてみたり
sql_obj = Table.where({join含む複雑な条件}).join("xxx").select("*")
new_obj = Table.where("id IN (?)", sql_obj.ids)
調べてみるとどうも、サブクエリーでやる方法が早いらしい。
(そもそも最初から id で引っ張る必要あったの? とかいうツッコミも気にせず続けます)
new_obj = Table.where("id IN (?)", sql_obj)
ただ実はこのままだと、最初の sql_obj の select(*) に左右されるので、
実行エラーになっちゃいます。
サブクエリーで使用するためには id だけの select にしたいので、
except を使用して、select をリセットして上書きしちゃいます。
wk_obj = sql_obj.except(:select).select(:id)
new_obj = Table.where("id IN (?)", wk_obj)
すると、アラ不思議! サブクエリーで取得できちゃうんです奥様。
レスポンスも申し分ない仕上がりで、今なら金利手数料は当社が負担いたします!(なにが?)
...というわけで簡単ではございましたが、こんな感じでよろしいんでしょうか?
決して手抜きしているわけじゃありません。
ダセェ...オレなら何かもっといい方法知ってるぜ!って方の情報
お待ちしておりますので、どしどしご応募ください。
追伸.
ruby で数値配列の合計、さくっと出せないのかなぁ... ループとか書きたくねぇ...
ハイ!
[1, 2, 3].inject(:+)
=> 6
こんなイディオムが普通に存在してる ruby って、相変わらず関心しちゃうぐらい
素敵な言語ですよね。
# ツッコミでそもそも 2.4 移行は sum が使えるみたいです...