rails runner は、Railsアプリのコードをスクリプトとして実行するためのコマンドだ。rails console と違い対話形式ではなく、書いたコードを一気に実行して終わるのが特徴。


rails console との違い

rails console rails runner
形式 対話型(REPL) スクリプト実行
用途 手動で試したいとき 処理を自動化したいとき
終わり方 自分で exit する コード実行後に自動終了
定期実行 不可 cron などと組み合わせ可能

rails console は「手で試す用」、rails runner は「自動実行用」と覚えておくとわかりやすい。


基本的な使い方

文字列で直接実行

rails runner "puts User.count"

"..." の中にRubyコードを書くだけで実行できる。

ファイルを指定して実行

rails runner script/hello.rb

script/hello.rb の中身:

users = User.where(active: true)
users.each do |user|
  puts user.name
end

具体的なユースケース

データの一括更新

# script/fix_emails.rb
User.where(email: nil).each do |user|
  user.update!(email: "unknown_#{user.id}@example.com")
end
puts "完了"
rails runner script/fix_emails.rb

ActiveRecordがロードされているので、モデルはそのまま使える。puts の出力はターミナルに直接表示される。

定期バッチ処理(cron と組み合わせ)

# 毎日深夜0時に実行する例(crontab)
0 0 * * * cd /app && bundle exec rails runner script/daily_report.rb

cronと組み合わせることで、定期的なデータ集計やレポート送信を自動化できる。


環境の指定

# 本番環境で実行
rails runner -e production "User.find(1).update!(name: 'test')"

# 環境変数で指定する方法
RAILS_ENV=staging rails runner script/batch.rb

注意点

エラーが起きるとそこで処理が止まるため、本番実行前に必ずローカルや検証環境で動作確認をしておく必要がある。本番データを操作するスクリプトは特に慎重に扱う。


まとめ

rails runner は、Railsの環境を丸ごと読み込んだ上でRubyスクリプトを実行する仕組みだ。ちょっとしたデータ修正・移行・集計に使いやすく、cronやCIと組み合わせることで定期バッチ処理にも応用できる。


参考文献・リンク

https://guides.rubyonrails.org/command_line.html#rails-runner

https://railsguides.jp/command_line.html#rails-runner