[英]How do I run a ruby script, that I put in my /lib/tasks/ directory in my Rails app, once?
[英]How do I run Ruby tasks that use my Rails models?
我有一些基本模型的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
我建议创建自定义的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运行任务。
您可以这样在脚本中打开连接:
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:username => "root",
:host => "localhost",
:password => "******",
:database => "******"
)
我敢肯定有一种更优雅的方法可以做到这一点,以便它从您的database.yml中获取信息。
只需执行几个步骤,便需要更多细节才能真正回答。
您说您的网站从其他来源检索数据吗? 多常? 如果它是半定期的,则您肯定要研究后台处理/消息传递。 如果经常发生,您确实希望避免在每次脚本运行时都加载Rails环境,因为每次都将支付过高的启动税。
您将要研究多种选择。 阅读其中的每一个,特别是发表了他们为什么做出选择的人的评论,将使您对做出选择之前需要问自己的问题有一个很好的感觉。 正在加载多少工作? 等等...
在我的头顶上,这些是您可能需要研究的一些东西
脚本/运行者和Cron后台/ RB Starling工作MemcacheQ Beanstalk后台作业(Bj)delay_job(Dj)守护程序生成器
在“ 铁轨工作:最佳实践? ”中查看我的答案。
它包含两个使用cron运行Rake任务和类方法的示例(通过script/runner
)。 在这两种情况下,都会加载Rails,并且可以使用模型。
尼斯Joyent的编写使用耙运行升轨道从cron作业任务- http://wiki.joyent.com/accelerators:kb:rails:cron
运行与Rails应用程序/模型交互的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模态运行交互的ruby代码任务!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.