N個ActiveRecordのオブジェクト(モデルA)があったとして、それらが持つassociation(モデルB)のデータは要らずcountだけ表示したいとする。 その際、以下のような4つの手が思いつく。 AのテーブルにBの数をキャッシュするカラムを追加し、それをSELECTする belongs_toのcounter_cacheオプション N回BのCOUNTクエリを走らせる 普通にやるとこうなる LEFT JOINとGROUP BY A.idでB.idをCOUNTする がんばってクエリを1回にするとこうなる N個のA.idからB.a_idをpluckしてきて各idごとの個数をとる これをやる方法がないので作った: k0kubun/activerecord-has_count count専用のhas_count associationを生やし、外部キーをpluckする専用のpreloade
countじゃなくてsizeを使った方がいい!! アソシエーションがLoadされてるか調べて常に高速なメソッドを作ろう!RubyRails RailsのActiveRecordって、DBの問い合わせ回数を意識し始めると意外と悩むことって多いですよね。 少し意識している人なら、N+1問題を防ぐためにincludes, preload, eagerloadメソッドなどを使っているはずです。 このエントリは、あらかじめLoadされているかで挙動が変わるメソッドを、使ったり、作ったりしたら、eagerloadもより効果的に使えて、ちょっと幸せになれるよという話です。 問題提起:Loadされているかいないか?何が変わるか? まず、以下のようにpost has_many comments な関係があるとします。
ActiveRecordでN+1クエリを潰すためにeager loadingを行う場合、preloadやincludesやeager_loadが役に立つ。 Preload, Eagerload, Includes and Joinsという記事にそれらの違いがよくまとめられているんだけど、includesが挙動を変える条件があまり正確に書かれていなくて自信が持てなかったし、そもそも記事が古いのでRails4.1.5のソースを読んで調べた。 せっかく調べたので、全体を通して日本語でまとめてみようと思う。 User.joins(:posts).where(posts: { id: 1 }) # SELECT `users`.* FROM `users` INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id` WHERE `posts`.`id
Overview The Ruby on Rails web framework provides a library called ActiveRecord which provides an abstraction for accessing databases. This page lists many query methods and options in ActiveRecord which do not sanitize raw SQL arguments and are not intended to be called with unsafe user input. Careless use of these methods can open up code to SQL Injection exploits. The examples here do not inclu
7 Patterns to Refactor Fat ActiveRecord Models という記事があり、読もう読もうと思いつつ1年くらい経ってしまった。 ようやく読んだので理解した内容を書いておく。 コード例は元記事のもの。 Rails で thin controller, fat model を心がけていると、model がマジで激太りしてヤバくなる。 実際に自分が仕事で書いている rails アプリも激太りしててヤバい。 この blog の筆者が作っている CodeClimate で C 判定をもらう程度には肥満体型になっている。 Mixinに抜き出さない! Model が太ってきた時に考えるのは ActiveSupport::Concern を使って感心事を抜き出して、Mixin にすることだと思う。 実際に手元のアプリでも models/concerns/ なんていうディレ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く