当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何运行使用我的Rails模型的Ruby任务?》经验,为你挑选了2个好方法。

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

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

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

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

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

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



1> csexton..:

您可以通过简单地要求environment.rb在任何ruby脚本中加载整个rails环境:

require "#{ENV['RAILS_ROOT']}/config/environment" 

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

这有一个额外的好处,就是为你提供你在其余rails代码中拥有的所有好的类和对象.

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

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



2> Tim Harding..:

我同意上面的答案,但您必须在您的任务中包含=>: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

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有