ActiveAdmin:如何在以 CSV 格式下载所有资源的同时拥有一组特定的资源?

ActiveAdmin: How to have a specific set of resources while downloading them all in CSV format?

AcitveAdmin在索引页底部提供了一个link可以下载多种格式的所有资源,其中一种格式是CSV。它会获取所有资源,将它们放入 CSV 文件中,然后将其返回给我们。在我的情况下,我有一个条件,可以通过 CSV 下载某些资源,例如:

User.downloadables

但我无法弄清楚如何将此集合而不是 User.all 转换为 CSV 格式?

我查看了文档,除了更改 CSV 文件的布局外,它并没有说太多。

您还可以为活动管理员自定义 csv 导出。

ActiveAdmin.register Post do
  csv force_quotes: true, col_sep: ';', column_names: false do
    column :title
    column(:author) { |post| post.author.full_name }
  end
end

干杯

显然,我找不到将特定记录集传递到 CSV 文件的方法,所以我在 ActiveAdmin 中为其编写了自定义控制器方法,这就是我完成它的方法:

app/models/user.rb:

scope :downloadables, -> { where(status: :downloadable) }

def self.to_csv
  downloadable_users = User.downloadables
  CSV.generate do |csv|
    csv << column_names
    downloadable_users.each do |user|
      csv << user.attributes.values_at(*column_names)
    end
  end
end

app/admin/user.rb:

首先,我生成了一个收集操作,可以让我们下载 CSV 文件:

collection_action :download_csv do
  redirect_to action: :download_csv
end

现在,要在索引页上有一个 link,通过它可以下载 CSV 文件中的记录:

action_item only: :index do
  link_to "Download CSV", download_csv_admin_users_path
end

最后要有一个控制器方法,它实际上会从模型中调用方法,并完成剩下的魔术:

controller do
  def download_csv
    respond_to do |format|
      format.html { send_data User.to_csv, filename: "users-#{Data.today}.csv" }
    end
  end
end

就是这样。正在运行。