我正在尝试将数据导出为CSV文件。这是我的模特:
def self.generate_csv(ids)
CSV.generate({:col_sep => "\t"}) do |csv|
csv << ['topfind terminus id','position','sequence','protein (uniprot ac)','topfind evidence ids']
ids.each do |id|
n = Nterm.find(id)
csv << [n.externalid,n.pos,n.protein.sequence[n.pos-1..n.pos+9],n.protein.ac,n.evidences.collect{|e| e.externalid}.join(':')]
end
end
end
这是此模型的控制器,它调用此方法:
def show
puts "id search: [#{params[:id]}]"
@output = Nterm.generate_csv(params[:id])
respond_to do |format|
format.html
format.csv { send_data @output.as_csv }
end
p @output
end
这是我的观点:
<%= link_to "Export to CSV", {:method=> "show", :id => @nterm.map {|i| i.id }} %>
在这种情况下,我不太清楚在我的节目视图中放什么。如何制作CSV?
答案 0 :(得分:2)
将视图更改为以下内容,使用您的路径路径进行查看操作,而不是id
,传递ids
,因为它的ID集合不是单个ID。
<%= link_to "Export to CSV", your_route_path(:format => :csv, :ids => @nterm.map {|i| i.id }}) %>
对于接收ids
def show
@output = Nterm.generate_csv(params[:ids])
#your codes goes here
end
答案 1 :(得分:0)
@rokibul-hasan 已经回答了这个问题,但我也建议您进行一次查询以获取所有对象:
@objects = Nterm.find(ids)
并循环遍历这些对象,而不是在每个 ID 上调用 .find
,因为您正在为每个记录访问数据库,这是不必要的。所以像:
@objects.each do |object|
csv << [object.externalid, object.pos, ...]
end