Rails runner でバッチ処理 - ヤフーニュースのRSSを取得してDBに保存する
Rails runner について
環境
まずは、動かす
Railsアプリケーション内の/config/application.rb
に以下を記述し
config.autoload_paths += Dir["#{config.root}/lib"]
次に、/lib/tasks/runner_test.rb
を作成する。
class Tasks::RunnerTest def self.execute puts 'I am a Ruby Runner' end end
実行してみる
% bundle exec rails runner Tasks::RunnerTest.execute
動く!
ここまでまとめ
/config/application.rb
のautoload_paths
に Dir["#{config.root}/lib"] を追加。- バッチ本体を
/lib/tasks/
に作成する。ファイル名はrunner_test.rb
。この場合、クラス名はTasks::RunnerTest
と指定する。 - rails runner の引数にファイルのクラスとメソッド(
Tasks::RunnerTest.execute
)を指定して実行する。 - 'I am a Ruby Runner' と出力される。
ヤフーニュースのRSSを取得してDBに保存する
通常のRails アプリケーションと同様に
Model.new
やModel.where("id = 1")
などのメソッドが使えるのでテーブルにデータを保存してみる。
サンプル
仕様: ヤフーニュースのトピックストップのRSSを取得してタイトルをtopics テーブルに格納する。
ここではテーブルやModelファイルは作成しているものとする。
require 'rss' class Tasks::RunnerTest def self.execute rss_source = "http://news.yahoo.co.jp/pickup/rss.xml" begin rss = RSS::Parser.parse(rss_source, true) rescue RSS::Error end rss.items.each do |item| topic = Topic.new p item.title topic.title = item.title topic.save end end end
とりあえず、タイトルだけ抽出して保存する。
実行する。
すると
無事、DBに格納された。
あとは、これをcron で定期的に実行するようにすればバッチ処理のできあがり。
おしまい。
【参考】