2010-11-12 9 views
1

J'ai actuellement un contrôleur qui va gérer un appel pour exporter une table dans un fichier CSV en utilisant la gemme FasterCSV. Le problème est que les informations stockées dans la base de données ne sont pas claires parfois et je veux donc changer la sortie pour une colonne particulière.Changement de sortie pour FasterCSV

Ma colonne project.status a par exemple des nombres au lieu de statuts, ie 1 dans la base de données correspond à Active, 2 à Inactive et 0 à Not Yet Yet. Quand j'exporte le tableau, il montre 0,1,2 au lieu de Actif, Inactif ou Pas encore décidé. Une idée de comment mettre en œuvre cela?

J'ai essayé une simple boucle qui vérifie le fichier CSV généré en dernier et modifie chaque 0,1,2 à sa sortie correspondante, mais le problème est que toutes les autres colonnes qui avaient un 0,1,2 changeraient aussi. Je ne suis pas sûr de savoir comment isoler la colonne. Merci d'avance

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 

Répondre

1

Ceci est en fait assez facile. Dans votre code de contrôleur:

#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 

Puis dans votre code de modèle. Vous avez probablement déjà une méthode qui décode le statut DB à un plus descriptif si:

#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 

Il y a probablement un certain nombre de façons dont vous pouvez refactoriser cela. Dans le contrôleur au moins, il serait probablement préférable de faire de ce chercheur une portée nommée plus descriptive. Les constantes dans le modèle pourraient être mises en configuration SettingsLogic ou une autre gemme similaire.

+0

J'ai le mien écrit comme ceci STATUS = {: APPLYING => 0,: REJECTED => 1,: READY => 2,: SUSPENDED => 3,: PENDING => 4} .freeze, où tout est en un variable. Je suis toujours confus quant à pourquoi je devrais modifier mon modèle. La vue ou le contrôleur ne devrait-il pas gérer cela? – TheRealVayne

+0

Pas du tout, le modèle est en charge de toute la logique métier, qui dans ce cas serait la traduction des champs stockés de la base de données en champs lisibles par l'homme. Le modèle peut être utilisé par de nombreuses vues et contrôleurs, et dupliquer le code pour fournir un statut lisible serait un anti-pattern assez significatif. –

Questions connexes