Изменение выхода для FasterCSV - PullRequest
1 голос
/ 12 ноября 2010

В настоящее время у меня есть контроллер, который будет обрабатывать вызов для экспорта таблицы в файл CSV с использованием гема FasterCSV. Проблема в том, что информация, хранящаяся в базе данных, иногда не ясна, и поэтому я хочу изменить вывод для определенного столбца.

Мой столбец project.status, например, имеет номера вместо статусов, т.е. 1 в базе данных соответствует активному, 2 для неактивного и 0 для еще не решенного. Когда я экспортирую таблицу, она показывает 0,1,2 вместо Активно, Неактивно или Еще не решено. Есть идеи, как это реализовать?

Я попробовал простой цикл, который проверял бы окончательно сгенерированный CSV-файл и изменял бы каждый 0,1,2 на соответствующий ему вывод, но проблема в том, что любой другой столбец, имеющий 0,1,2, также изменился бы. Я не уверен, как изолировать колонку. Заранее спасибо

 def csv
    qt = params[:selection]
    @lists = Project.find(:all, :order=> (params[:sort] + ' ' + params[:direction]), :conditions =>  ["name LIKE ? OR description LIKE ?", "%#{qt}%", "%#{qt}%"])

    csv_string = FasterCSV.generate(:encoding => 'u') do |csv|
      csv << ["Status","Name","Summary","Description","Creator","Comment","Contact Information","Created Date","Updated Date"]
      @lists.each do |project|
              csv << [project.status, project.name, project.summary, project.description, project.creator, project.statusreason, project.contactinfo, project.created_at, project.updated_at]
      end
    end

    filename = Time.now.strftime("%Y%m%d") + ".csv"
    send_data(csv_string,
      :type => 'text/csv; charset=UTF-8; header=present',
      :filename => filename)
  end

1 Ответ

1 голос
/ 12 ноября 2010

Это на самом деле довольно легко.В коде вашего контроллера:

  #app/controllers/projects_controller.rb#csv
  @lists.each do |project|
          csv << [project.descriptive_status, project.name, project.summary, project.description, project.creator, project.statusreason, project.contactinfo, project.created_at, project.updated_at]
  end

Затем в коде вашей модели.Вероятно, у вас уже есть метод, который декодирует статус БД в более описательный, хотя:

#app/models/project.rb

ACTIVE_STATUS = 0
INACTIVE_STATUS = 1
NOT_YET_DECIDED_STATUS = 2

def descriptive_status
  case status
    when ACTIVE_STATUS
      "Active"
    when INACTIVE_STATUS
      "Inactive"
    when NOT_YET_DECIDED_STATUS
      "Not Yet Decided"
  end
end

Возможно, есть несколько способов, которые вы можете затем реорганизовать.По крайней мере, в контроллере, вероятно, было бы лучше сделать этот искатель более описательным именованным контекстом.Константы в модели могут быть перенесены в конфигурацию SettingsLogic или другой подобный камень.

...