Railsエンジニアがうっかり踏みがちな落とし穴10選

技術

Railsは「開発効率の高さ」で選ばれるフレームワークの代表格です。
シンプルに書けて便利な機能も多いですが、その裏側には思わぬ落とし穴も潜んでいます。

「知識としては知っているのに、実務でやらかす」──そんな罠は中堅以上のエンジニアでも油断するとハマりがちです。

この記事では、Rails歴がある程度ある人でも思わずやらかす罠10選をピックアップし、回避策とあわせて紹介します。
読み終わる頃には「あ、これ昔やったわ…」と苦笑しつつ、ちょっと安全にRailsと付き合えるようになるはずです。


default_scope を使う


便利そうに default_scope { where(active: true) } を書くと、全クエリに見えないWHEREが勝手に付与される。
「なんで取れないの?」とデバッグ地獄。本番事故あるある。

回避策

  • 基本、使わない
  • 条件は named scope で明示的に書く (User.active)
  • multi-tenant のような特殊ケースも専用Gemやmiddlewareで担保する

includes / eager_load 爆死


N+1回避しようと includes(:a, :b, :c…) → JOINが爆発して逆に遅くなる。

回避策

  • .preload.eager_load の違いを理解
  • 必ず to_sql / EXPLAIN で実行計画を確認

STI が肥大化して破綻


「まとめてきれい!」と思ったら100カラムのモンスター。結局メンテ不能。

回避策

  • 安易にSTIを選ばない
  • Polymorphicも外部キー制約が効かないので要注意
  • 必要なら中間テーブルに切り出す

migration の down 書かない問題


changeremove_columnexecute を書くと rollback 不能。
CIで「戻せねぇ!」と発覚する。

回避策

  • reversibleじゃない操作は def up / def down を分ける
  • 開発時に一度rollback確認を必ず実施

before_save で属性加工する


バリデーション後に値を上書きするため、validationとDBの整合性がズレることがある。
例: presence: true は通ったのに、before_save で空文字に変換されて保存される。

回避策

  • 属性正規化や加工は before_validation に置く
  • before_save は監査用の情報追加など「副作用最小」にとどめる
  • コールバック乱用せず、明示的に処理を書くのが安全

Time.now で9時間ズレる問題


開発(JST)では動くけど、本番(UTC)で「昨日の日付!」となる。

回避策

  • Railsでは Time.zone.now または Time.current を徹底
  • DB保存はUTC、表示時だけ in_time_zone

false返ってるのに更新された気になる罠

user = User.find(1)        # DB: "Bob"

user.update(name: nil)     # => false (バリデーションNG)
user.name                  # => nil   (インスタンスは更新済み)
User.find(1).name          # => "Bob" (DBは更新されていない)

update が失敗すると false は返すけれど、インスタンスの属性は変わっている。
「保存された」と勘違いして処理を進めるとバグになる。

回避策

  • update が false の場合は必ず分岐して処理を止める
  • 「DBと同期した状態」が必要なときは .reload で再取得

migration 設計の落とし穴(ridgepole派の視点)


Rails標準migrationだとALTER TABLEで本番ロック→サービス停止。

回避策

  • ridgepoleでDDLをコード化して安全に管理
  • チームで思想を揃えて「migrationは設計の一部」と捉える

production console 事故


sandbox 付け忘れて本番データを吹き飛ばす。

回避策

  • aliasで rails console --sandbox をデフォ化
  • 本番は「readonly console」を別途用意

便利Gem依存でアップデート地獄


短期的に楽できるGemがRailsのメジャーアップデートで詰む。

回避策

  • 小さく自作できるものはGemに頼らない
  • メンテ状況を確認してから導入する

まとめ

Railsは開発効率が高い反面、便利さゆえに思わぬ落とし穴も潜んでいます。
「知識として知っている」だけではなく、「実際の挙動や運用まで意識して扱う」ことが大切です。

これらの罠を理解しておけば、より安心してRailsの強みを活かせるはずです。

コメント

タイトルとURLをコピーしました