我有一个带有一些基本型号的Rails应用程序。该网站显示从其他来源检索的数据。所以我需要编写一个Ruby脚本,在我的数据库中创建新实例。我知道我可以用测试钩子做到这一点,但我不确定这里有意义。
我不确定这个任务应该是什么样的,我如何调用它,或者它应该放在我的源代码树(lib \ tasks?)中。
例如,这是我的第一次尝试:
require 'active_record'
require '../app/models/mymodel.rb'
test = MyModel.new
test.name = 'test'
test.save
此操作失败,因为它无法连接到数据库。这对我的新手大脑来说是模糊的,因为据推测,Rails正在做幕后的所有魔术工作来设置所有这些东西。那我该如何设置我的小脚本?
答案 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任务! :)
这是一个例子
运行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代码任务!