🛤️

Railsを書くときの注意点のまとめ

2 min read

自分が気をつけたいと思う点を忘れないようにまとめました。

📝1. Rubyに関する注意点

eachとmapについて

eachとmapは以下の点で違う。

  • eachは出力が元の配列
  • mapは出力が処理をした後の配列
[1,2,3].each do |i|
  i * 2
end
# => [1,2,3]

[1,2,3].map do |i|
  i * 2
end
# => [2,4,6]

ドキュメンテーション

filter_mapについて

各要素に対してブロックを評価した値のうち、真であった値の配列返す。条件に合った要素だけに対して処理が行える。

[1,2,3].filter_map { |i| i * 2 if i.even? } #=> [4]

📝2. Railsに関する注意点

eager_load, preload

N+1問題を回避するためにあらかじめデータを読み込んでおく。
eager_loadはleft joinを使い、preloadは指定したテーブルをSELECT文でクエリする。

blank? present?

  • オブジェクトが空白であるかどうかを判定する -> empty?
  • オブジェクト空白・またはnilかどうかを判定する -> blank?
  • 存在するかどうかを確認する -> present? (!blank?と同義)
    blank?とpresent?はrailsのメソッドであることに注意。

RuntimeErrorとStandardError

ドキュメンテーションによると

RuntimeErrorは特定の例外クラスには該当しないエラーが起こったときに発生します。また Kernel.#raise で例外クラスを指定しなかった場合も RuntimeError が発生します。
StandardErrorは通常のプログラムで発生する可能性の高い例外クラスを束ねるためのクラスです

before_action, after_action

共通した前処理や後処理はbefore_action/after_actionなどにまとめる

ビジネスロジックのバリデーションについて

ビジネスロジックのバリデーションはcontrollerではなくmethod内で行う

SELECTとpluckについて

とある条件に合ったUserのidを取り出したいときに、SELECTだとサブクエリで発行される。

User.where(...).select(:ids) #SQL1回
User.where(...).pluck(:id) #SQL2回

Bulk追加について

Active Recordを初期化するよりも、Hashをbulk insertした方がパフォーマンスが良い。

https://matsu.teraren.com/blog/2021/03/21/csv-activerecord-import/

📝その他

ここではRails関係なくどの言語でも気をつけたいと思うことをまとめます

DRY原則(Don't repeat yourself)

同じことを何回も書くのを避けること。変数に入れたり、ヘルパーにしたりして重複を避けよう。

ループを少なく心がける

以下のような同じループをする場合はまとめること。

ids.each do |id|
  # 何かしらの処理1
end
ids.each d |id|
  # 何かしらの処理2
end

値の初期化は直前で

以下のような例はやめて、使う直前で初期化すること

a = 3
# 関係ない処理
# ...
# 関係ない処理
c = a * 2

早期return

例外などの場合は早めにreturnすること

Discussion

ログインするとコメントできます