首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Rails 4中将属性导出到CSV时设置属性的格式

如何在Rails 4中将属性导出到CSV时设置属性的格式
EN

Stack Overflow用户
提问于 2016-10-13 13:21:55
回答 2查看 1.4K关注 0票数 1

我正在尝试将一些记录导出到CSV,因此在我的控制器中我有以下内容:

代码语言:javascript
复制
...
send_data @orders.to_csv, filename: "orders-#{Date.today}.csv"
...

在模型中,我有以下几点:

代码语言:javascript
复制
     def self.to_csv

        attributes = %w{ customer_name created_at order_id currency discount subtotal_tax total }

        CSV.generate(headers: true) do |csv|
          csv << attributes
          all.each do |order|
            if order['created_at']
              order['created_at'] = order['created_at'].strftime("%d/%m/%Y")
            end
            csv << attributes.map{ |attr| order.send(attr) }
          end
        end

      end

我想格式化一些参数,正如您从下面的代码中可以看到的:

代码语言:javascript
复制
if order['created_at']
  order['created_at'] = order['created_at'].strftime("%d/%m/%Y")
end

所以我会有时间格式化我想要的,但这是行不通的。

知道为什么吗?

编辑:我的个人档案

代码语言:javascript
复制
source 'https://rubygems.org'
    ruby '2.2.2'

    gem 'rails', '4.2.1'
    gem 'sass-rails', '~> 5.0'
    gem 'sprockets', '3.1.0'
    gem 'devise'
    gem 'angular-rails-templates'
    gem 'mongoid', '~>4'
    gem 'bson_ext'
    gem "mongoid-enum"
    gem "haml-rails"
    gem 'simple_form'
    gem 'bootstrap_form'
    gem 'mongoid-slug'
    gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
    gem 'mini_magick'
    gem 'uglifier', '>= 1.3.0'
    gem 'jquery-rails'
    gem 'turbolinks'
    gem 'jbuilder', '~> 2.0'
    gem 'rest-client'
    gem 'execjs'
    gem 'therubyracer'
    gem 'redis-rails'
    gem 'stripe', :git => 'https://github.com/stripe/stripe-ruby'
    gem 'mongoid-versioning'
    gem 'rack-cors'
    gem 'bcrypt', '~> 3.1.7'
    gem 'sidekiq', '~> 3.4.2'
    gem 'sidetiq'
    gem 'sinatra', '>= 1.3.0', :require => nil
    gem 'puma'
    gem 'paypal-sdk-rest'
    gem "mongoid-paperclip", :require => "mongoid_paperclip"
    gem 'aws-sdk', '~> 1.3.4'
    gem 'money-rails'
    gem 'geocoder'
    gem 'kaminari'
    gem 'mongoid_auto_increment'
    gem 'aws-sdk-rails'
    gem 'mailcatcher'

    group :development, :test do
        gem "faker", "~> 1.4.3"
        gem 'guard-rails'
        gem 'spork-rails'
        gem 'guard-spork'
        gem 'childprocess'
        gem 'spring-commands-rspec'
        gem 'rspec-rails'
        gem 'guard-rspec'
        gem 'rb-fsevent', :require => false
        gem 'guard-livereload', require: false
        gem 'cucumber-rails', :require => false
        gem 'database_cleaner'
        gem 'byebug'
        gem 'web-console', '~> 2.0'
        gem 'spring'
        gem 'mongoid-rspec'
        gem 'capybara'
        gem 'factory_girl_rails'
        gem 'capistrano',         require: false
        gem 'capistrano-rvm',     require: false
        gem 'capistrano-rails',   require: false
        gem 'capistrano-bundler', require: false
        gem 'capistrano3-puma',   require: false
        gem 'capistrano-secrets-yml', '~> 1.0.0'
    end

    group :doc do
        gem 'sdoc', '~> 0.4.0'
    end

    group :production do
        gem 'rails_12factor', '0.0.2'
    end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-13 21:47:44

这不是那么优雅的解决方案,但它有效:

转到app/config/initializers并创建date_format.rb文件。填上:

代码语言:javascript
复制
Time::DATE_FORMATS[:default] = "%d/%m/%Y"
Date::DATE_FORMATS[:default] = "%d/%m/%Y"

您的模型现在应该是这样的:

代码语言:javascript
复制
  def self.to_csv

    attributes = %w{ customer_name created_at order_id currency discount subtotal_tax total }

    CSV.generate(headers: true) do |csv|
         csv << attributes

         datetime = DateTime.now

         all.each do |order|
           if order['created_at']
             order['created_at'] =  datetime.to_formatted_s(:default)
           end
           csv << attributes.map{ |attr| order.send(attr) }
         end
       end
  end

如果您想要添加时间,只需将date_format.rb更新为:

代码语言:javascript
复制
 Time::DATE_FORMATS[:default] = "%d/%m/%Y %H:%M:%S"
 Date::DATE_FORMATS[:default] = "%d/%m/%Y %H:%M:%S"

这很有挑战性。希望能帮上忙。

参考文献

编辑

您的模型还有一个解决方案。如果这对你有用,请告诉我。只需将下面的代码替换为前面的代码即可。我很好奇:

代码语言:javascript
复制
def self.to_csv

    attributes = %w{ customer_name created_at order_id currency discount subtotal_tax total }

    CSV.generate(headers: true) do |csv|
      csv << attributes
      all.each do |order|
        if order['created_at']
          order['created_at'] = order.created_at.strftime("%d/%m/%Y")
        end
        csv << attributes.map{ |attr| order.send(attr) }
      end
    end

  end
票数 1
EN

Stack Overflow用户

发布于 2017-05-03 10:55:02

在当前的项目上进行测试。

如果不更新模型实例(db数据),第一个循环将无法工作,第二个循环只是映射数据。更容易操控。

代码语言:javascript
复制
  def self.to_csv
    attributes = %w{ customer_name created_at order_id currency discount subtotal_tax total }
    CSV.generate(headers: true) do |csv|
      csv << attributes
      all.each do |order|
        csv << attributes.map do |attr| 
          if attr == 'created_at'
            order.created_at.strftime("%d/%m/%Y")
          else
            order.send(attr)
          end
        end
      end
    end
  end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40022245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档