1

私は現在、FasterCSV gem を使用してテーブルを CSV ファイルにエクスポートするための呼び出しを処理するコントローラーを持っています。問題は、データベースに格納されている情報が明確でない場合があるため、特定の列の出力を変更したいということです。

たとえば、私の 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
4

1 に答える 1

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

次に、モデル コードで。ただし、DBステータスをよりわかりやすいものにデコードするメソッドがすでにある可能性があります。

#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構成または別の同様の gem に取り込むことができます。

于 2010-11-12T11:45:31.310 に答える