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

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

我有一些领域的模型。

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

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

你会在哪里进行这种迁移行动? 在控制器? 不是我想的。

感谢所有提示

完全忽略控制器。 模型用作访问数据的抽象层。 在您的情况下,您有一些数据库forms的本地持久数据,并且您将远程数据作为JSON over 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任务处理业务逻辑,您的模型处理与数据的交互。 干净整洁。

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

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

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

 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是应用程序的内部部分。 此外,你不希望有视图,所以绝对不是控制器工作,而是模型。

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

您应该保留批处理作业,如数据处理和从主服务Web应用程序填充。 编写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值。

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