Экспорт в CSV из сложного запроса рельсов
Я следил за этим видео с Railscast, но у меня возникли серьезные трудности с экспортом моих данных в Excel (или CSV в этом отношении).
Я использую will_paginate в некоторых данных, которые я показываю на веб-интерфейсе следующим образом:
sql = "select complex..."
@data = paginate_by_sql([sql],
:per_page => params[:rows],
:page => params[:page])
Итак, как я и думал, это должно работать:
respond_to do |format|
format.html
format.xls { send_data @data.to_csv(:col_sep => "\t") }
end
и он на самом деле правильно загрузил файл xls, так как содержимое перепутано, он показывает одну строку на столбец и что-то вроде этого в качестве содержимого:
#<Product:0x00000004c83328>
PS -> с помощью рельсов последняя версия
:: РЕДАКТИРОВАТЬ:: Под одной строкой в столбце я имею в виду только одну строку в моем листе Excel и в этой строке
КОЛОННА А = #<Product:0x00000004c83328>
КОЛОННА B = #<Product:0x00000004c83329>
КОЛОННА C = #<Product:0x00000004c8333>
(30 столбцов)
ОБНОВИТЬ
Выполните простое упражнение для тестирования и снова получите все столбцы только в одном столбце:
csv_string = CSV.generate(:col_sep => ",") do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
end
respond_to do |format|
format.html
format.csv { send_data csv_string,
:type => 'text/csv; charset=iso-8859-1; header=present',
:disposition => "attachment; filename=records.csv" }
end
(:col_sep => ",")
необязательно, я полагаю.
результат:
3 ответа
Хорошо, так это то, что я сделал.
изменил ответчик на это...
respond_to do |format|
format.xls
end
и создал шаблон с именем nameofmethod.xls.erb с этим...
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="Sheet1">
<Table>
<Row>
<% @data.first.attributes.keys.each do |column| %>
<Cell><Data ss:Type="String"><%=column%></Data></Cell>
<% end %>
</Row>
<% @data.each do |row| %>
<Row>
<% row.attributes.values.each do |column| %>
<Cell><Data ss:Type="String"><%= column %></Data></Cell>
<% end %>
</Row>
<% end %>
</Table>
</Worksheet>
</Workbook>
Это довольно динамично для любого вида объекта ActiveRecord. На данный момент это придется сделать...
Вы почти там, вам просто нужно сопоставить каждый из ваших Product
моделировать объекты, потому что вы звоните to_s
на них, который не определен.
Так что если вы просто хотите получить список названий, вы можете переопределить to_s
метод по вашей модели (app/models/product.rb
) сделать что-то вроде:
def to_s
title
end
Или, чтобы создать список через запятую, вы можете сделать
def to_s
[title, price, availability].join(',')
end
Вы можете использовать этот драгоценный камень, вы можете легко экспортировать любой сложный запрос.