Rails runner でバッチ処理 - ヤフーニュースのRSSを取得してDBに保存する

Rails runner について

環境

Rails: 4.0.0
Ruby: 2.0.0

まずは、動かす

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 

f:id:snowlong:20151011154941p:plain

動く!

ここまでまとめ

  1. /config/application.rbautoload_paths に Dir["#{config.root}/lib"] を追加。
  2. バッチ本体を/lib/tasks/に作成する。ファイル名はrunner_test.rb。この場合、クラス名はTasks::RunnerTest と指定する。
  3. rails runner の引数にファイルのクラスとメソッド(Tasks::RunnerTest.execute )を指定して実行する。
  4. 'I am a Ruby Runner' と出力される。

ヤフーニュースのRSSを取得してDBに保存する

通常のRails アプリケーションと同様に Model.newModel.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

とりあえず、タイトルだけ抽出して保存する。

実行する。

f:id:snowlong:20151011164214p:plain

すると

f:id:snowlong:20151011164023p:plain

無事、DBに格納された。

あとは、これをcron で定期的に実行するようにすればバッチ処理のできあがり。

おしまい。

【参考】

【Rails】バッチ処理を実装したいけどActiveRecordを中で使ったりもしたいし - 東京伊勢海老通信

rails runnerを使ってみた - Qiita

Ruby on Rails 4アプリケーションプログラミング