我有一个带有一些基本型号的Rails应用程序.该网站显示从其他来源检索的数据.所以我需要编写一个Ruby脚本,在我的数据库中创建新实例.我知道我可以用测试钩子做到这一点,但我不确定这里有意义.
我不确定这个任务应该是什么样的,我如何调用它,或者它应该放在我的源代码树(lib\tasks?)中.
例如,这是我的第一次尝试:
require 'active_record' require '../app/models/mymodel.rb' test = MyModel.new test.name = 'test' test.save
这会失败,因为它无法连接到数据库.这对我的新手大脑来说是模糊的,因为大概是Rails正在做幕后的所有魔术工作来设置所有这些东西.那我该如何设置我的小脚本呢?
您可以通过简单地要求environment.rb在任何ruby脚本中加载整个rails环境:
require "#{ENV['RAILS_ROOT']}/config/environment"
这假定RAILS_ROOT环境变量已设置,请参阅我的评论以了解其他方法.
这有一个额外的好处,就是为你提供你在其余rails代码中拥有的所有好的类和对象.
为了启动你的过程,听起来cron会做你想做的事情,我还会在你的capistrano配方中添加一个任务,将你的脚本添加到crontab,定期从外部源获取数据并更新你的数据库.这可以通过cronedit gem 轻松完成.
cron方法确实有一些缺点,主要是开销和控制,对于其他更复杂的选项,请参阅rails wiki中的HowToRunBackgroundJobsInRails.
我同意上面的答案,但您必须在您的任务中包含=>:environment,否则它将不会加载Rails环境.
例如,
namespace :send do namespace :trial do namespace :expiry do desc "Sends out emails to people who's accounts are about to expire" task :warnings => :environment do User.trial_about_to_expire.has_not_been_notified_of_trial_expiry.each do |user| UserMailer.deliver_trial_expiring_warning(user) user.notified_of_trial_expiry = true user.save end end end end end