Группировка данных и разбиение на страницы с помощью Rails - PullRequest
0 голосов
/ 02 февраля 2011

У меня есть модель таблицы импорта CSV:

class ImportTable < ActiveRecord::Base
   has_many :import_cells, :dependent => :destroy
end

class ImportCell < ActiveRecord::Base
    belongs_to :import_table
end

Контроллер (отредактирован для краткости):

def show
   @import_table = ImportTable.find(params[:id])

   @import_cells = @import_table.import_cells
   @row_index_max = @import_cells.map { |cell| cell.row_index }.max
   @column_index_max = @import_cells.map { |cell| cell.column_index }.max
end

Ячейки import_cells имеют row_index и column_index, я группирую их по столбцам в представлении.

<table border="1" cellspacing="1" cellpadding="1">
<tr>
  <% 0.upto(@column_index_max) do |column_index| %>
    <th>
      <%= f.select(column_index, []) %>
    </th>
  <% end %>
</tr>
<% 0.upto(@row_index_max) do |row_index| %>
<% row = @import_cells.select { |cell| cell.row_index == row_index } %>
<tr>
  <% 0.upto(@column_index_max) do |column_index| %>
    <td>
      <%= row.select { |cell| cell.column_index == column_index }[0].contents %>
    </td>
  <% end %>
</tr>
<% end %>
</table>

Я взломал это с другого сайта, и это кажется мне чокнутым. Просто добавив:

@import_cells = @import_table.import_cells.paginate(:all, :order => "row_index ASC", :per_page => @column_index_max * 16, :page => params[:page])

Не совсем работает, так как будут * ноль объекты, созданные will_paginate, с которыми нужно разобраться. Мне кажется, в этом слишком много логики. Какой хороший подход, чтобы взять здесь? Я думаю о добавлении метода row для группировки столбцов в самой модели ImportTable, но он должен быть гибким в зависимости от того, сколько столбцов в конкретной таблице. Тогда строки могут быть разбиты на страницы.

Будем благодарны за любые мысли, предложения и толчки в направлении "рельсов"!

1 Ответ

1 голос
/ 03 февраля 2011

У нас есть настройка, подобная этой на сайте, над которым я работаю, и я имел дело с ним следующим образом:

Создайте "таблицу" (фактически массив массивов) в контроллере:

@table = []
max_col = 0
@table_cells.each do |cel|
    @table[cel.row] ||= []
    @table[cel.row][cel.col] = cel
    max_col = [max_col, cel.col].max
end

#This bit fleshes out your rows with nils to ensure you have a rectangular table:
# (edited to handle empty rows properly)
@table.each_with_index do |row, i|
    @table[i] = [] unless row
    @table[i][max_col] ||= nil
end

И в представлении все, что вам нужно сделать, - это перебрать таблицу и показать клетки:

<table>
<% @table.each do |row| -%>
    <tr>
<% row.each do |cel| -%>
        <td><%=h cel.whatever %></td>
<% end -%>
    </tr>
<% end -%>
</table>

Недостатком этого метода является то, что вы должны построить целоетаблица в памяти перед рендерингом страницы (вы могли бы сделать это по очереди, если вы правильно отсортировали столбцы).Плюсы в том, что он очень хорошо придерживается MVC (и, следовательно, «Rails Way»), и @table очень полезен, когда у вас есть функция для его сборки - как только она у вас есть, вы можете вывести практически любой формат, какой хотитепросто настраивая вид.Мы используем его для HTML и CSV и планируем добавить XLS, как только у кого-то появится время на изучение формата.

...