2016-09-01 9 views
0

私はRailsの新機能をよく使い、コードを整理する方法について質問があります。私は脂肪の多いモデルと皮肉なコントローラについて読んで、それは(理論的には)意味があります。データをダウンロードして保存するコードはどこに置くのですか?

私が今やっているのは、定期的に(CronとRailsランナーを介して)インターネットからデータをダウンロードし、その一部をデータベースに保存することです。私が理解していないのは、データを取得するAPIを使用しているコードを記述する場所です。ダウンロードしたデータを分割して2つの異なるモデル/データベーステーブルに格納されている別のケースについてどう

API data 
    '--> Model --> Database 

:私はモデルにそれを置くと、それはこのように見てみましょうか?選択するのはどのバージョンですか?

バージョン1:

API data 
    '--> Model --> Database 
      '--> Model --> Database 

はバージョン2:

API data 
    '--> Controller 
      |--> Model --> Database 
      '--> Model --> Database 

あなたの助けをありがとう! :)あなたがrake task_nameで実行

+1

schedule.rbファイルを作成したときにして

。 'app/service_objects/download_data_from_api.rb' –

+1

^それは悪い考えではありません。私はしばしばそれをレーキタスクとして書いたので、 'lib/tasks'まで続きます。次にcronはrakeコマンドを実行します。 – agmcleod

+0

私は、ActiveRecordから継承していないRubyクラスをモデルフォルダに置くことはまったく問題ではないと主張します。 Rubyメソッドを 'rails runner" Model.method "'で直接実行することができます。レイクタスクは必要ありません。 – spickermann

答えて

0

@agmcleodはあなたがraketaskで行くべきで示唆したように、し、それに追加するcronジョブ

スタートで:

rails g task api_service fetch_data_for_model1 fetch_data_for_model2

lib/tasks/api_service.rake

オープン
namespace :api_servicedo 
    desc "Update database with new Movies" 
    task :fetch_data_for_model1=> :environment do 
    puts 'start fetching data' 
    API.new(credentials).fetch_movies.each do |movie| 
     puts "creating movie id =#{movie.id}" 
     Movie.find_or_create_by(movie.attributes) 
    emd 
    puts 'Finisheed!' 
    end 

    desc "TODO" 
    task :fetch_data_for_model2=> :environment do 
    .... 
    end 

end 

今すぐオープン

crontab -e

、それはあなたが執筆のための明確な構文を提供https://github.com/javan/wheneverを使用してcronジョブの展開を検討するタスクのパス

00 00 * * * cd /Users/you/projects/myrailsapp && /usr/local/bin/rake RAILS_ENV=production api_service:fetch_data_for_model1 

を熊手与えます。あなたはおそらくあなたがサービスオブジェクトまたは何かを作成することができ、このような定義

every 1.day, :at => '4:30 am' do 
    rake 'api_service:fetch_data_for_model1' 
end 
関連する問題