LoginSignup
2
1

More than 3 years have passed since last update.

Thorのコマンドの中でrailsのActiveRecordを使う

Last updated at Posted at 2019-07-08

以前railsのタスクの書式という記事を書きましたが、railsのタスクが引数がややこしくて、オプションもスマートに使えず余り好きではありません。

Thorでコマンドを書く方が好きなのですが、Thorの中でActiveRecordを使ってDBの操作が出来たのでメモしておきます。

以下はrailsアプリケーションの直下にthorというディレクトリを作りthor/foobarにコマンドがある想定のコードです。

railsのautoloadも効くのでthorをGemfileに追加します。

gem 'thor', '~> 0.20'

@scivola さんにコメントいただきましたがrailtiesがthorに依存しているのでGemfileには書かなくても読み込めます。ただし私の環境で試したところrequire 'thor'を書かないとuninitialized constant Thorで動きませんでした。


#!/usr/bin/env ruby

require_relative '../config/application'
Rails.application.initialize!

class Main < Thor
  desc "exec", "foobar"
  def exec
    binding.pry
  end
end

Main.start(ARGV)

これで

thor/foobar exec

で実行可能です。なんてことは無くてconfig/environment.rbのコードを丸っと持ってきただけです。なので

RAILS_ENV=production thor/foobar exec

で実行するとproduction環境で実行可能です。

spring経由で起動してないので起動が重いのが玉に傷です。やり方をちょっと調べてみて、ちなみにspring経由で起動するのにこんなタイムリーな記事があったのですが、残念ながら記事内のリンク先のgithubのリンクが死んでいてコードを見ることが出来ませんでした。spring-commands-rspecも参考になると思ってみてみましたが、私がspringの仕組み自体全く理解してないのでイマイチでよく分かりませんでした。その内調べて分かったらまた共有します。何かご存じの方いらっしゃいまたらヒントでも結構ですのでコメントお願いします!

-- 2019/07/31追記
Thorで引数の解析をしつつspring経由でrailsを読み込む方法を発見したので記事を書きました。
Rails でコマンドラインを書く時の決定版

2
1
3

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
2
1