以下情况(ror 3,ruby 1.9)。
我有一些有某些领域的模特。
现在我想抓住一个json feed(每小时f.e.)将内容与我存储的模型对象进行比较,如果这个json feed中有一个新项目,则放入一个新的模型对象。
我不知道在哪里放置这种自动化操作。 我不认为在模型方法中这样做是正确的,我是对的吗?
您将在哪里执行此迁移操作?在控制器?不是我想的。
感谢所有提示
答案 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请求,每小时触发一次,以获取此新闻源并在必要时创建条目。