【问题标题】:Exporting CSV in Rails with a class method being called on an array of objects在对象数组上调用类方法在 Rails 中导出 CSV
【发布时间】:2014-05-05 05:28:29
【问题描述】:

我想从 Rails 导出一个 csv 文件,我正在关注 Railscast 关于这个主题的内容 (http://railscasts.com/episodes/362-exporting-csv-and-excel?view=asciicast)。

在 Railscast 中,控制器 (products_controller.rb) 包含:

    def index
      @products = Product.order(:name)
      respond_to do |format|
        format.html
        format.csv { send_data @products.to_csv }
      end
    end

产品模型 (models/product.rb) 包含:

    def self.to_csv
      CSV.generate do |csv|
        csv << column_names
        all.each do |product|
          csv << product.attributes.values_at(*column_names)
        end
      end
    end

从这个 StackOverflow 问题 (Exporting CSV data from Rails) 中可以看出,to_csv 是在类对象数组上调用的类方法。我预计这会失败,因为 to_csv 没有在 Product 类上被调用。

这行得通,但为什么行得通?

【问题讨论】:

  • 我不确定你的意思。自我是您的模型,产品在您的情况下。方法 .to_csv 是一个类方法。你在 Product 类上调用了 .to_csv 方法,你觉得哪一部分很奇怪?
  • 对不起,我没有很清楚地表达我的困惑。我在控制器中期待 Product.to_csv(@products) 而不是 @products.to_csv 之类的东西。

标签: ruby-on-rails ruby-on-rails-4 export-to-csv


【解决方案1】:

您确实是正确的 - 您正在发送消息 to_csv 到一个实例,最初是 ActiveRecord::Relation,最终转换为 Array

您是否需要csv?如果是这样,将to_csv 发送到Array 的实例将起作用。

stdlib/csv 库装饰 Array - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/Array.html

【讨论】:

    【解决方案2】:

    我的问题应该是“为什么将消息 to_csv 发送到 ActiveRecord::Relation 的实例会导致调用 Product 类对象上的方法?”

    在 Rails 中,类方法自动成为“收集”方法;这就是它们可用于 Relation 对象的原因(请参阅我之前错过的这个 SO 问题/答案:how does this Ruby class method get invoked?)。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2017-05-13
      • 2021-02-26
      相关资源
      最近更新 更多