如何在rails上的ruby中创建一个活动的作业来读取json文件然后将数据传输到数据库

时间:2016-03-04 03:33:40

标签: ruby-on-rails ruby rails-activejob

我是新手。 我有问题,我使用Ruby on Rails构建一个Web。 我想从json文件中获取数据然后插入到数据库中。 json文件中的数据可以随时增加。所以我应该有一个后台工作,以一定的间隔运行。 我读过Ruby文档,它说我可以使用Active Job。 但我仍然混淆这样做。 我应该一步一步地做些什么呢?或者你们可以举个例子吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用 ActiveJob

活动作业设置

Active Job适配器必须设置为:sidekiq ,否则它将只使用默认值:inline。

这可以在 config / application.rb 中完成,如下所示:

例如:

class Application < Rails::Application
  # ...
  config.active_job.queue_adapter = :sidekiq
end

接下来,生成Job:

rails generate job Example

示例JSON数据:

{
    "title"  :    "Ruby In Rails",
    "url"    :    "http://rubyinrails.com",
    "posts"  :    {
                    "1":"strftime-time-format-in-ruby",
                    "2":"what-is-gemset"
                  }
}

将创建/app/jobs/example_job.rb

class ExampleJob < ActiveJob::Base
  # Set the Queue as Default
  queue_as :default

  def perform(*args)
    # Perform Job
    require 'json'

    # Open JSON File
    root = Rails.root.to_s       
    file = File.read('#{root}/data.json')


    # Parse Data from File
    data_hash = JSON.parse(file)

    # Do the SAVING and validation HERE...
    test = Sample.new
    test.title = data_hash['title']
    ......
    test.save


  end
end

用法,例如在控制器中:

ExampleJob.perform_later args

Documentations Here

或者,如果您希望使用 CRONJOB 来执行该功能:

例如,在Rails应用程序中的 lib / tasks / 中创建一个名为“ save_json.rb ”的文件。

代码:

namespace :save_json do
  desc "..."
  task :execute => :environment do
    require 'json'

    # Open JSON File
    root = Rails.root.to_s       
    file = File.read('#{root}/data.json')


    #Parse Data from File
    data_hash = JSON.parse(file) 

    #Getting DATA

    data_hash['title']
     => "Ruby In Rails"
    data_hash.keys
     => ["title", "url", "posts"]
    data_hash['posts']
     => { "1" => "strftime-time-format-in-ruby", "2" => "what-is-gemset" }

    # Do the SAVING and validation HERE...
    test = Sample.new
    test.title = data_hash['title']
    ......
    test.save

end

在crontab中设置后台作业功能

vi /etc/crontab

代码: 例如每分钟 ....

*/1 * * * * cd /my_rails_app && bundle exec rake save_json:execute