如何运行使用我的Rails模型的Ruby任务?
我有一个带有一些基本模型的Rails应用程序。 该网站显示从其他来源检索的数据。 所以我需要编写一个Ruby脚本,在我的数据库中创建新的实例。 我知道我可以用测试钩子做到这一点,但我不确定这里有意义。
我不确定这个任务应该是什么样的,我如何调用它,或者它应该放在我的源代码树(lib \ tasks?)中。
例如,这是我的第一次尝试:
require 'active_record' require '../app/models/mymodel.rb' test = MyModel.new test.name = 'test' test.save
这会失败,因为它无法连接到数据库。 这对我的新手大脑来说是模糊的,因为据推测,Rails正在做幕后的所有神奇工作来设置所有这些东西。 那我该如何设置我的小脚本呢?
我同意上面的答案,但你必须在你的任务中包含=>: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
您可以通过简单地要求environment.rb在任何ruby脚本中加载整个rails环境:
require "#{ENV['RAILS_ROOT']}/config/environment"
这假定RAILS_ROOT环境变量已设置,请参阅我的评论以了解其他方法。
这还有一个额外的好处,就是为你提供你在其余rails代码中拥有的所有漂亮的类和对象。
为了开始你的过程,听起来cron会做你想做的事情,我还会在你的capistrano配方中添加一个任务,将你的脚本添加到crontab,定期从外部源获取数据并更新你的数据库。 这可以通过cronedit gem轻松完成。
cron方法确实有一些缺点,主要是开销和控制,对于其他更复杂的选项,请参阅rails wiki中的HowToRunBackgroundJobsInRails 。
我建议创建自定义rake任务(lib / task / foo.rake)。 这使您可以轻松访问rails应用程序的大多数function。
namespace :foo do desc 'do something cool' def something_cool test = MyModel.new test.name = 'test' test.save end end
然后:
$ rake -T foo rake foo:something_cool # do something cool
您甚至可以通过cronjob运行任务。
我前一段时间写了一篇关于此事的post。
您可以在脚本中打开连接:
ActiveRecord::Base.establish_connection( :adapter => "mysql", :username => "root", :host => "localhost", :password => "******", :database => "******" )
我确信有一种更优雅的方法可以做到这一点,因此它会从您的database.yml中获取信息。
这个步骤很少,需要更多细节才能真正回答。
您说您的网站从其他来源检索数据? 多常? 如果它是半定期的,你肯定想看看后台处理/消息。 如果经常你真的想避免每次你的脚本运行时加载你的rails环境,因为你每次都要支付太高的启动税。
您需要研究多种选择。 阅读他们每一个,特别是那些发表他们为什么做出选择的人的评论,会让你对自己在做出选择之前需要问自己的问题有一个很好的感受。 加载数据的工作量有多大? 等等…
这些是你可能想要研究的一些问题
Script / Runner&Cron背景/ RB Starling Workling MemcacheQ Beanstalk背景作业(Bj)delayed_job(Dj)守护进程生成器
看看我在“ 铁路的cron job:best practices? ”中的回答。
它包含两个使用cron运行Rake任务和类方法的示例(通过script/runner
)。 在这两种情况下,都会加载Rails,您可以使用模型。
Nice Joyent编写了使用rake从cron作业运行rails任务 – http://wiki.joyent.com/accelerators:kb:rails:cron
运行与rails app / models交互的ruby任务的最简单方法是让Rails为您生成Rake任务! 🙂
这是一个例子
-
运行
rails g task my_namespace my_task
-
这将生成一个名为
lib/tasks/my_namespace.rake
的文件,如下所示:
namespace :my_namespace do desc "TODO: Describe your task here" task :my_task1 => :environment do #write any ruby code here and also work with your models puts User.find(1).name end end
-
使用
rake my_namespace:my_task
运行此任务 -
观察与rails modal运行交互的ruby代码任务!