如何运行使用我的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运行任务。

您可以在脚本中打开连接:

 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任务! 🙂

这是一个例子

  1. 运行rails g task my_namespace my_task

  2. 这将生成一个名为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 
  1. 使用rake my_namespace:my_task运行此任务

  2. 观察与rails modal运行交互的ruby代码任务!