哪里可以立即请求数据,解析它并保存在Rails应用程序中?

时间:2015-05-14 02:12:59

标签: ruby-on-rails

红宝石和铁轨新手。我正在研究我的第一个应用程序,该应用程序将解析托管在另一台服务器上的XML的信息(我能够通过net / http执行此操作)。然后我需要能够在加载应用程序的根目录时将解析后的数据保存到我的sqlite数据库中,因为我需要访问它。

我不完全确定我应该在何处启动解析并立即将其保存到我的数据库中,以便在根页面加载后立即将其提供。这是否应该全部放在指向我的根索引的控制器中(或者应该由模型在某处处理)?

如果有更好/更快/更有效的方式来立即访问和保存这些数据(与解析相反,查看数据库中的信息是否是最新的,如果没有则保存),那么我将不胜感激任何建议。

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要使用delayed_jobs https://github.com/collectiveidea/delayed_job 在初始化文件夹文件夹中,创建一个看起来像这样的文件(这是我的)

 Delayed::Worker.destroy_failed_jobs = false
 Delayed::Worker.sleep_delay = 2
 Delayed::Worker.max_run_time = 5.minutes
 Delayed::Worker.read_ahead = 10
 Delayed::Worker.default_queue_name = 'default'

if Delayed::Worker.delay_jobs
  begin
    ScheduledWorker.new.schedule
  rescue => e
    Rails.logger.info e; Honeybadger.notify e
  end
end

Class ScheduledWorker

  NEXT_RUN_AT = lambda { Chronic.parse("next saturday") }
  MAX_ATTEMPTS = 1

  def max_attempts
    MAX_ATTEMPTS
  end

  def process
  end

  def after
    self.schedule unless Rails.env.test?
  end

  def schedule
    self.class.new.delay(run_at: NEXT_RUN_AT.call).process unless exists?
  end

  private

  def exists?
    Delayed::Job.where("handler like '%#{self.class.name}%'").where(locked_at: nil, failed_at: nil).exists?
   end
end