0

这是我试图从 rails c 加载的代码示例(在 lib 文件夹内——文件 data2.json 也在 lib 目录内)

$LOAD_PATH.unshift(File.expand_path(".", File.dirname(__FILE__)))
$LOAD_PATH.unshift(File.expand_path("./lib", File.dirname(__FILE__)))

require 'company_gem_class'

class LoadJson

  def go
   File.open(Rails.root, 'lib', 'file.json') do |f|
      f.each_line do |line|
        this_line = JSON.parse(line)
        hash_parser = CompanyGemClass.new(line)
        c = Company.new
        c.followers = hash_parser.followers
        c.company_name = hash_parser.company_name
        c.date_joined = hash_parser.date_joined
        ...
        c.save
      end
    end
 ...
 end

计划是/是通过一个(公司)类直接从 rails 控制台加载所有这些原始数据。我收到很多“json 文件不存在”(Ennooent::path/to/file.json 不存在)。

我试过把它放在 lib/assets 文件夹和 lib 文件夹中,但还没有成功。我该如何完成将这些 json-->ruby 对象批量上传到数据库的任务?

^^我已经捆绑安装了 json gem。^^json 文件是每行一个哈希,所以这就是我这样做的原因

4

1 回答 1

1
  1. 我敢肯定你知道(但从你的问题中并不完全明显)它File.open不会LOAD_PATH用于任何事情。因此,无论您放入什么LOAD_PATH,都不会影响其File.open工作方式。LOAD_PATH仅修改require搜索文件的方式。

  2. 在 Rails 中,您的所有文件操作都应用Rails.root作基本路径。在使用 Rails 时,您不能依赖当前的工作目录是特定的。

    所以任何LOAD_PATH修改都应该像这样进行:

    $LOAD_PATH.unshift(File.join(Rails.root, 'my', 'uber', 'lib'))
    
  3. 由于 (1) 和 (2) - 如果您要以File.open最可靠的方式打开任何文件,请使用Rails.root

    File.open(File.join(Rails.root, 'path', 'to', 'file.json'))
    

    或者在你的情况下:

    File.open(File.join(Rails.root, 'lib', 'assets', 'file.json'))
    
  4. 默认情况下,在 Railslib中已经存在LOAD_PATH。所以你不需要单独添加它。

于 2012-07-21T03:00:41.447 回答