我已经构建了几个Rake任务,将一系列CSV文件导入我的PostgreSQL数据库,但我总是将这些任务定向到本地计算机上的路径。
我需要将任务设置为访问一个安全的on目录,这样我的客户端就可以简单地将文件复制到这个目录中,当执行Rake任务时,它会自动从在线源中提取。
这似乎是我代码中的一个简单调整,但我不确定如何使其工作。如果有人建议阅读或可以快速帮助编辑我的代码,我们将不胜感激。
以下是我的Rake任务之一的副本:
require 'csv'
namespace :import_command_vehicles_csv do
task :create_command_vehicles => :environment do
puts "Import Command Vehicles"
csv_text = File.read('/Users/Ben/Sites/ror/LFD/command_vehicles.csv', :encoding => 'windows-1251:utf-8')
csv = CSV.parse(csv_text, :headers => true)
csv.each_with_index do |row,index|
row = row.to_hash.with_indifferent_access
CommandVehicle.create!(row.to_hash.symbolize_keys)
command_vehicle = CommandVehicle.last
if @report_timesheet_hash.key?(command_vehicle.report_nr)
command_vehicle.timesheet_id = "#{@report_timesheet_hash[command_vehicle.report_nr]}"
end
#command_vehicle.timesheet_id = @timesheet_id_array[index]
command_vehicle.save
end
end
end
您可以创建可以接受参数的rake-tast,然后您可以传递任何您喜欢的路径。
查看此链接Set Multiple Environmental Variables On Invocation of Rake Task,了解如何通过环境变量和此链接传递参数http://viget.com/extend/protip-passing-parameters-to-your-rake-tasks查看括号符号。
'/Users/Ben/Sites/ror/LFD/command_vehicles.csv'
只能在本地机器上工作,除非您在远程主机上有一个相同的资源路径,这是不可能的。因此,您需要将绝对路径更改为相对于文件的路径。
我的桌面上有一个文件夹层次结构,卡住了几个文件夹,比如:
-试验|lib|-测试.rb|配置|-config.yaml
test.rb包含:
File.realpath('../config/config.yaml', File.dirname(__FILE__))
__FILE__
是一个特殊变量,它返回当前正在解释的脚本的绝对路径。如果你知道其他东西相对于当前__FILE__
的存在位置,那么就很容易找到它在哪里。
realpath
返回的值将是"config.yaml"文件的绝对路径,基于其与当前文件的相对路径。换句话说,这将返回类似于:
/Users/ttm/Desktop/tests/junk/test/config/config.yaml
Rake的好处是它确实使用了Ruby脚本,所以您可以利用File.realpath
之类的东西。此外,请记住,Rake对当前工作目录的想法是基于正在运行的脚本的位置,因此它想要访问的所有内容都必须相对于脚本的位置或绝对路径,或者您必须使用chdir
或cd
来更改Rake对目前工作目录的看法。
做后面的事情最终会让我头疼,所以我更喜欢定义一些指向所需资源的常量,这样做很容易找到真正的绝对路径。
请参阅"如何获取Ruby中为使用提示调用的命令的名称?"了解更多信息。