我已经构建了几个Rake任务来将一系列CSV文件导入我的PostgreSQL数据库,但我总是将这些任务定向到我本地计算机上的路径。
我需要设置任务来访问安全的目录,这样我的客户端就可以简单地将文件复制到这个目录中,当执行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
答案 0 :(得分:1)
'/Users/Ben/Sites/ror/LFD/command_vehicles.csv'
只能在您的本地计算机上运行,除非您在远程主机上拥有相同的资源路径,这几乎不可能。因此,您需要将绝对路径更改为相对于文件的路径。
我的桌面上有一个文件夹层次结构,卡住了几个文件夹,如:
- test | lib | - test.rb | config | - 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对当前工作目录的想法是基于正在运行的脚本的位置,因此它想要访问的所有内容必须相对于脚本的位置或绝对路径,或者您必须更改Rake的想法使用chdir
或cd
进行当前工作目录。
做后者让我的头脑最终受伤所以我更喜欢定义一些指向所需资源的常量,并且通过这种方式找出真正的绝对路径变得容易。
请参阅“How can I get the name of the command called for usage prompts in Ruby?” 了解更多信息。
答案 1 :(得分:1)
您可以创建可以接受参数的rake tast,然后您可以传递任何您喜欢的路径。
查看此链接Set Multiple Environmental Variables On Invocation of Rake Task,了解如何通过环境变量和http://viget.com/extend/protip-passing-parameters-to-your-rake-tasks链接传递参数,以查看括号表示法。