LoginSignup
77
57

More than 5 years have passed since last update.

rails runner のススメ

Last updated at Posted at 2017-08-29

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が分かっているモデルを表示
  • モデルの個数を表示

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

77
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
77
57