Ruby on Rails には runner
というサブコマンドがある。Railsの環境でRubyを実行するコマンドであるが、主にメンテナンスの際に非常に便利である。
使い方
rails runner
の実行方法は3通りある。以下、 Member
というモデルがあり、その属性 name
を全件表示する、というサンプルを考える。
メソッドへのパスを指定
"rails runner" でググると大体出てくる。 "lib/" 以下にスクリプトを保存し、メソッドへのパスをコマンドの引数に指定する。
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
を使おう。
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/ 以下に入れておくとよい。
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が分かっているモデルを表示
- モデルの個数を表示
これを知っておけば、毎日のメンテナンスが少しだけハッピーになるかも。