2010-11-12 2 views
1

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

В моем столбце project.status, например, есть номера вместо статусов, т.е. 1 в базе данных соответствует Активному, 2 для Неактивного и 0 для Not Yet. Когда я экспортирую таблицу, она отображает 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

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

#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 или другой подобный камень.

+0

У меня есть мои записи как это STATUS = {: APPLYING => 0,: REJECTED => 1,: READY => 2,: SUSPENDED => 3,: PENDING => 4} .freeze, где все находится в одном переменная. Я все еще смущен, почему мне нужно изменить мою модель. Разве это не должно выглядеть мнение или контроллер? – TheRealVayne

+0

Совсем не так, модель отвечает за всю бизнес-логику, которая в этом случае была бы переводом хранимых полей базы данных в поля, читаемые человеком. Модель может использоваться многочисленными представлениями и контроллерами, и дублирование кода для обеспечения читаемого статуса будет довольно значительным анти-шаблоном. –

Смежные вопросы