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 書かない問題
罠change
に remove_column
や execute
を書くと 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の強みを活かせるはずです。
コメント