使用Rails对数据和分页进行分组

时间:2011-02-02 20:59:25

标签: ruby-on-rails-3 pagination will-paginate

我有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_indexcolumn_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创建的nil对象必须处理。在我看来,视图中有太多的逻辑。在这里采取什么好方法?我正在考虑添加row方法来对ImportTable模型本身中的列进行分组,但它必须具有灵活性,具体取决于特定表中的列数。然后行可以分页。

对“轨道方向”方向的任何想法,建议和推动表示赞赏!

1 个答案:

答案 0 :(得分:1)

我们正在制作的网站上有类似的设置,我按照以下方式处理:

在控制器中构建一个“表”(实际上是一个数组数组):

@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

在视图中,您所要做的就是遍历表并显示cels:

<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。