0

这可能是我的一个巨大的疏忽,但我一直在寻找解决方案大约一个小时,但没有运气!

我正在关注关于将数据导出到 .CSV 的 RailsCast 教程

我用来填充 CSV 的数据来自Ransack查询(在参数中)

然而,被吐出的数据是数据对象的集合,而不是原始数据本身——

浏览器中的输出:

#<Order:0x007f820823c738>,#<Order:0x007f82082ad708>,#<Order:0x007f82082ace98>,
#<Order:0x007f82082ac718>

我只是想得到那些相同的对象,但只是打印出来......就像在 RailsCasts 教程(截图

这是我的 Orders_Controller

def index
  @search = Order.search(params[:q])
  @orders = @search.result

  @results = @orders

  respond_to do |format|
    format.html # index.html.erb
    format.csv { render text: @results.to_csv }
  end
end

那么有没有一种简单的方法可以将这些数据对象转换为教程中的原始字符串?

编辑

这是我to_csv的模型中的方法

def self.to_csv(options = {})
  CSV.generate(options) do |csv|
    csv << column_names
    all.each do |order|
      csv << order.attributes.values_at(*column_names)
    end
  end
end
4

1 回答 1

2

所以我认为这就是问题所在:@search.result是一个订单数组,@results.to_csv调用Array#to_csv方法也是如此。由于您没有得到,ActiveRecord::Relation您可能需要以不同的方式转换为 csv。

在中创建一个ransack_helpers.rb模块lib

module RansackHelpers
  def self.to_csv(ransack_result, options = {})
    CSV.generate(options) do |csv|
      result_array = ransack_result.result
      column_names = result_array.first.class.column_names
      csv << column_names
      result_array.each do |item|
        csv << item.attributes.values_at(*column_names)
      end
    end
  end
end

orders_controller.rb

def index
  @search = Order.search(params[:q])
  @orders = @search.result

  respond_to do |format|
    format.html # index.html.erb
    format.csv { render text: RansackHelpers.to_csv(@search) }
  end
end

我没有测试过这段代码,所以可能会有一些问题,但我认为这是你想要做的。

于 2012-09-06T22:01:01.373 回答