RoR - 放置自动化流程的位置

时间:2011-02-18 08:45:09

标签: ruby-on-rails ruby ruby-on-rails-3 automation cron

以下情况(ror 3,ruby 1.9)。

我有一些有某些领域的模特。

现在我想抓住一个json feed(每小时f.e.)将内容与我存储的模型对象进行比较,如果这个json feed中有一个新项目,则放入一个新的模型对象。

我不知道在哪里放置这种自动化操作。 我不认为在模型方法中这样做是正确的,我是对的吗?

您将在哪里执行此迁移操作?在控制器?不是我想的。

感谢所有提示

6 个答案:

答案 0 :(得分:3)

完全忽略控制器。模型用作访问数据的抽象层。在您的情况下,您有一些数据库形式的本地持久数据,并且您将远程数据作为JSON通过HTTP检索。因此,您拥有常规的ActiveRecord模型,并且您拥有JSON数据的模型。

假设您有一个名为RemoteData的模型,它可以获取JSON文档,并且有一些方法可以从中干净地获取数据。您还有一个StoredData模型,可以在数据库中保留检索到的内容,以便稍后显示。

现在,您希望自动调用RemoteData.fetch('url'),然后在返回的数据上调用StoredData.create :params。为此,您将创建一个“rake任务”。这是一个例子:

# lib/tasks/fetch.rake
desc "Fetch remote data and persist it"
task :fetch => :environment do
  RemoteData.fetch('url').each do |json_data|
    sd = StoredData.create :url => 'url', :data => json_data
    puts "Retrieved 'url' and saved data in record ##{sd.id} at #{DateTime.now}."
  end
end

然后,您可以将系统crontab设置为尽可能频繁地运行。 Rake任务处理业务逻辑,您的模型处理与数据的交互。很干净。

答案 1 :(得分:0)

您应该将业务逻辑放在模型中,并将操作登录放在rake任务中,我认为这是此自动化任务的常用策略。你的cron应该是这样的:

cd /path/to/web_app && RAILS_ENV=environment /usr/local/bin/rake namespace:task

答案 2 :(得分:0)

我会在与Feed中的数据相关的模型中放入抓取json feed的代码。您可以为grab_feed方法编写测试并确保它正常工作。例如,如果你想废弃帖子,我会做这样的事情:

class Post < ActiveRecord

  def self.grab_feed
    (...)
  end
end

然后您可以随时使用:https://github.com/javan/whenever每小时检查一次此内容:

 every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
   runner "Post.grab_feed"
 end

您不应该使用控制器,因为您希望抓取Feed是应用程序的内部部分。此外,你不希望有视图,所以绝对不是控制器工作,而是模型。

答案 3 :(得分:0)

这里的问题是:你觉得这个JSON是一个视图还是只是“数据表示”?如果你考虑前者,你需要一个通常的控制器;如果您感觉它是数据,那么您可以编写一个rake任务并调用该方法(类似于:puts Model.scope1.scope2.to_json

答案 4 :(得分:0)

您应该保留批量作业,例如数据处理和从主要服务网络应用程序填充。 编写ruby脚本/ rake脚本并从cron运行它。

模型或控制器不是正确的位置。

以下是一些示例代码,用于编写访问应用程序模型的脚本。

require 'rubygems'
require 'active_record'

$config = YAML.load_file(File.dirname(__FILE__) + '/../green_app/config/'+ 'database.yml')
ActiveRecord::Base.establish_connection( $config[ENV['RAILS_ENV']] )
require File.expand_path File.dirname(__FILE__) + '/../green_app/app/models/post.rb'

并将其作为

运行
export RAILS_ENV="production" && ruby /path/to/your/script.rb

根据您的环境更改RAILS_ENV值。

答案 5 :(得分:-3)

为什么不把它放在控制器中?最后,它只是另一个动作,在这种情况下由自动用户驱动(cron)。我会做一个POST请求,每小时触发一次,以获取此新闻源并在必要时创建条目。