为什么Rails导出所有行而不是仅导出过滤结果?

时间:2015-06-11 12:44:07

标签: ruby-on-rails

我正在运行Rails 4应用程序并使用Ransack gem来过滤员工的结果。我已经看到了多个如何限制导出的CSV文件上的列的示例,但没有看到限制行的示例。根据我的理解,以下代码应该在已过滤的员工上调用.to_csv方法,但目前正在下载所有行。我是否需要将过滤结果的ID数组传递给.to_csv方法?

查看:

<h3>Download</h3>
<%= link_to "CSV", employees_path(format: "csv") %>

控制器:

def index
  @q = Employee.ransack(params[:q])
  @q.build_condition
  @employees = @q.result(distinct: true)
  respond_to do |format|
    format.html
    format.csv { render text: @employees.to_csv }
  end
end

型号:

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

2 个答案:

答案 0 :(得分:2)

我知道这有点延迟,但这就是我解决相同问题的方法。

将链接更改为具有params.merge,以保留过滤的结果。

<%= link_to "CSV", employees_path(params.merge(format: "csv")) %>

我还必须将format.csv更改为以下内容才能使其正常工作:

format.csv { send_data @employees.to_csv, filename: "employees.csv" }

希望这会有所帮助。

答案 1 :(得分:0)

在这一行中,您将添加所有员工模型。

all.each do |employee|

相反,你应该有像

这样的东西
def self.to_csv(employees)
  ..
  employees.each do |employee|
  ..
end

并像这样调用这个类方法:

format.csv { render text: Employee.to_csv(@employees) }

(Read more about class methods here)