Ruby
Rails

rails runner のススメ

More than 1 year has passed since last update.

Ruby on Rails には runner というサブコマンドがある。Railsの環境でRubyを実行するコマンドであるが、主にメンテナンスの際に非常に便利である。

使い方

rails runner の実行方法は3通りある。以下、 Member というモデルがあり、その属性 name を全件表示する、というサンプルを考える。

メソッドへのパスを指定

"rails runner" でググると大体出てくる。 "lib/" 以下にスクリプトを保存し、メソッドへのパスをコマンドの引数に指定する。

lib/maintainer/printer.rb
module Maintainer
  class Printer
    def self.members
      Member.all.each do |member|
        puts member.name
      end
    end
  end
end
rails runner Maintainer::Printer.members

ただし、引数付きのメソッドは定義できない(どう実行しても ArgumentError になる)。どうしても引数を使いたい場合は ARGV を使おう。

lib/maintainer/printer.rb
module Maintainer
  class Printer
    def self.members
      Member.where(Member.arel_table[:name].matches("%#{ARGV[0]}%")).each do |member|
        puts member.name
      end
    end
  end
end
rails runner Maintainer::Printer.members 沙霧

ファイルを指定

モジュールやメソッドの定義がいらない方法もある。単に実行したいコマンドを書き、 rails runner の引数にファイル名を指定する。バージョン管理に入れたくなければ tmp/ 以下に入れておくとよい。

tmp/printer.rb
Member.all.each do |member|
  puts member.name
end
rails runner tmp/printer.rb

モデル定義やGemのインポートは rails runner がやってくれるので、 require は書く必要なし。

コマンドを直接指定

rails runner の引数にRubyスクリプトを直接指定すれば、それをRails環境で実行できる。

rails runner 'puts Member.all.pluck(:name)'

Rails core extensionも使えるので地味に便利。

rails runner 'puts 30.months.from_now'

使い所

最大の特徴は、本番環境で実行できることである。やや複雑であったり、繰り返し実行する処理はRubyスクリプトとして保存しておき、 rails runner で呼び出すと手間がない。Routing prefix helperも使えるのでこんな処理も可能。

  • 特定の条件を満たす会員の個別ページURLの一覧
  • メディアサイトの場合、全ての記事から特定の単語を含む記事のURL一覧

逆に本当にシンプルな処理であれば、上記「引数にRubyスクリプトを直接指定」することで rails console よりも手軽になる。

  • IDが分かっているモデルを表示
  • モデルの個数を表示

これを知っておけば、毎日のメンテナンスが少しだけハッピーになるかも。