Почему вы не можете использовать точечную нотацию при доступе к информации из объекта строки CSV? - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь перебрать CSV-файл и распечатать информацию из строк. У меня есть две колонки с заголовками «описание» и «статус». Если я перебираю CSV-файл, я получаю серию <CSV::Row "description":<description> "status":<status> объектов. Я могу получить доступ к информации, используя csv_row["description"], но не csv_row.description. Так как Ruby создает объекты из информации в каждой строке, почему это не доступно с точечной нотацией?

Пример кода:

CSV.foreach(@file.path, headers:true) do |task|
    check_box = task["status"] == 0 ? "[ ] " : "[X] "
    puts check_box + task["description"]
end

1 Ответ

0 голосов
/ 27 августа 2018

CSV не работает таким образом, но вы можете использовать OpenStruct:

require 'ostruct'

CSV.foreach(@file.path, headers: true) do |row|
  task = OpenStruct.new(row.to_hash)
  check_box = task.status == '0' ? '[ ]' : '[X]'
  puts "#{check_box} #{task.description}"
end

Или просто создайте собственный класс, который соответствует вашим потребностям, например, через Struct:

Task = Struct.new(:status, :description) do
  def checkbox
    status == 0 ? '[ ]' : '[X]'
  end

  def to_s
    "#{checkbox} #{description}"
  end
end

CSV_OPTIONS = { headers: true, header_converters: :symbol, converters: :numeric }
CSV.foreach(@file.path, CSV_OPTIONS) do |row|
  task = Task.new(row[:status], row[:description])
  puts task
end
...