5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Okinawa.rbAdvent Calendar 2016

Day 9

逃げるは恥だがやくみつる

Last updated at Posted at 2016-12-09

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 が使えるみたいです...

5
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?