Rails/Model(Active Record)のTips


Active Recordで発行するクエリに関するTipsをいくつか紹介します。

🗻 like句のサニタイズ:sanitize_sql_like

like句の検索ワードはサニタイズを忘れてしまいがちです。そこでサニタイズをするsanitize_sql_likeを使うべきです。

# Like句の検索ワードのサニタイズがされていない
Hogehoge.where('name LIKE ?', "%#{sanitize_sql_like(params[:name])}%")

🚜 グルーピングしたカウント:group.count

group(:column).countでグルーピングした単位でcountを取得できます。

Article.group(:category_id).count

joinと組み合わせてカウントを行いたい場合は「activerecord-precount」というRubyGemsが便利です。

🐰 少しずつデータを取得:find_each

find_eachは一定件数ずつデータをDBから取得してメモリに展開し処理を行います。大量のデータを処理する場合はメモリに負荷をかけずに効率的に処理を行うことができます。

Article.find_in_batches(batch_size: 100).to_a
# Article Load (0.6ms) SELECT "Articles".* FROM "Articles" ORDER BY "Articles"."id" ASC LIMIT $1 [["LIMIT", 100]]
# Article Load (0.5ms) SELECT "Articles".* FROM "Articles" WHERE ("Articles"."id" > 100) ORDER BY "Articles"."id" ASC LIMIT $1 [["LIMIT", 100]]
# Article Load (0.4ms) SELECT "Articles".* FROM "Articles" WHERE ("Articles"."id" > 200) ORDER BY "Articles"."id" ASC LIMIT $1 [["LIMIT", 100]]

find_eachorderlimitを無視するので、注意してください。

🏀 ModelでURLを取得する

ControllerやView以外で、routes.rbで指定したURLを取得する場合はRails.application.routes.url_helpersをincludeします。

class Article < ApplicationRecord
include Rails.application.routes.url_helpers
def do_something
url = article_url(self)
# do something
end
end

🐠 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍