如何运行使用我的Rails模型的Ruby任务?

时间:2008-11-16 00:45:43

标签: ruby-on-rails ruby

我有一个带有一些基本型号的Rails应用程序。该网站显示从其他来源检索的数据。所以我需要编写一个Ruby脚本,在我的数据库中创建新实例。我知道我可以用测试钩子做到这一点,但我不确定这里有意义。

我不确定这个任务应该是什么样的,我如何调用它,或者它应该放在我的源代码树(lib \ tasks?)中。

例如,这是我的第一次尝试:

require 'active_record'
require '../app/models/mymodel.rb'

test = MyModel.new
test.name = 'test'
test.save

此操作失败,因为它无法连接到数据库。这对我的新手大脑来说是模糊的,因为据推测,Rails正在做幕后的所有魔术工作来设置所有这些东西。那我该如何设置我的小脚本?

9 个答案:

答案 0 :(得分:18)

只需要environment.rb:

,就可以在任何ruby脚本中加载整个rails环境
require "#{ENV['RAILS_ROOT']}/config/environment" 

这假设已设置RAILS_ROOT环境变量,请参阅我的评论以了解其他方法。

这还有额外的好处,就是为你提供你在其余rails代码中拥有的所有漂亮的类和对象。

启动你的过程听起来像cron会做你想做的事情,我还会在你的capistrano配方中添加一个任务,将你的脚本添加到crontab,定期从外部源获取数据并更新你的数据库。这可以通过cronedit gem轻松完成。

cron方法确实有一些缺点,主要是开销和控制,对于其他更复杂的选项,请参阅rails wiki中的HowToRunBackgroundJobsInRails

答案 1 :(得分:7)

我同意上面的答案,但你必须包括=> :您的任务中的环境,或者它不会加载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

答案 2 :(得分:3)

我建议创建自定义rake任务(lib / task / foo.rake)。这使您可以轻松访问rails应用程序的大部分功能。

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运行任务。

答案 3 :(得分:2)

答案 4 :(得分:1)

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

ActiveRecord::Base.establish_connection(
    :adapter  => "mysql",
    :username => "root",
    :host     => "localhost",
    :password => "******",
    :database => "******" 
)

我确信有一种更优雅的方式可以做到这一点,因此它会从您的database.yml中获取信息。

答案 5 :(得分:1)

这个步骤很少,需要更多细节才能真正回答。

您说您的网站从其他来源检索数据?多常?如果它是半定期的,你肯定想看看后台处理/消息。如果经常你真的想避免每次你的脚本运行时加载你的rails环境,因为你每次都要支付太高的启动税。

您需要研究多种选择。阅读他们每一个,特别是那些发表他们为什么做出选择的人的评论,会让你对自己在做出选择之前需要问自己的问题有一个很好的感受。加载数据有多大工作?等...

除了我的头脑,这些是你可能想要研究的一些事情

Script / Runner&克龙 背景/ RB 欧椋鸟 Workling MemcacheQ 魔豆 后台工作(Bj) delayed_job(Dj) 守护进程生成器

答案 6 :(得分:1)

在“A cron job for rails: best practices?”中查看我的回答。

它包含两个使用cron运行Rake任务和类方法的示例(通过script/runner)。在这两种情况下,都会加载Rails,您可以使用模型。

答案 7 :(得分:0)

Nice Joyent编写了使用rake从cron作业运行rails任务 - http://wiki.joyent.com/accelerators:kb:rails:cron

答案 8 :(得分:0)

运行与rails app / models交互的ruby任务的最简单方法是让Rails为你生成Rake任务! :)

这是一个例子

  1. 运行rails g task my_namespace my_task

  2. 这将生成一个名为lib/tasks/my_namespace.rake的文件,其外观如下:

  3. 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. 运行此任务
    3. 观看与rails modal运行交互的ruby代码任务!