0

我怎样才能记住部分渲染器中的某些状态?

手头的问题:我的部分_testitem.html.erb呈现了一组测试项的表行。ATestitem有一个id和 asortkey并且部分被称为

<%= render :partial => "testitem", :collection => @testbox.testitems.sort_by{|x| [x.sortkey, x.id]} %>

即所有的testitem 都按sortkey 排序,然后按它们的id 排序。现在我想显示一个显示当前排序键的表格列,我认为它会很好用

<td rowspan="<%= Testitem.count_by_sql "SELECT count(*) from testitems where sortkey=#{testitem.sortkey}" %>"><%=h testitem.sortkey %></td>

这当然会破坏表格,因为每个<td>获取都是行跨度。预期的结果看起来有点像

Group   |   Id  |    Description |
----------------------------------
   1    |    1  |    ...         |
        --------------------------
        |    2  |    ...         |
        --------------------------
        |    16 |    ...         |
----------------------------------
   2    |    3  |    ...         |
----------------------------------
   3    |    4  |    ...         |
        |   10  |    ...         |
        |   11  |    ...         |
 ---------------------------------

有没有办法“记住”(在里面)我已经为给定_testitem.html.erb添加了这个事实?<td rowspan="">sortkey

谢谢你的协助。

4

3 回答 3

1

在您的模型中,您可以执行以下操作:

class TestBox  
  named_scope :sorted_items, :sort_by => :sort_key, :id

  def grouped_items
    sorted_items.group_by(&:sort_key)
  end
end

在您看来,您可以这样做:

<% @test_box.grouped_items.each do |sort_key, items| %>
  <td rowspan="<% items.length %>"><%= render :partial => 'test_item', :collection => items %></td>
<% end %>

并在 test_item 部分:

<%= h item.sort_key %>

我不完全确定这会给你带来你想要做的事情,但它会让你在正确的方向上有个良好的开端。

于 2009-12-30T23:52:15.203 回答
1

首先,如果您无论如何都使用测试箱的所有测试项,则不需要额外的计数查询。

你想要做的是用组的 td 绘制第一个项目部分,然后定期绘制其余项目..

在控制器中:

@testitems_by_keys = @testbox.testitems.group_by(&:sortkey)

在你看来:

<% @testitems_by_keys.each do |group, items| %>
  <%= render :partial => "item", :locals => { :object => items.shift, :group => group, :size => items.size+1 } %>
  <%= render items %>
<% end %>

在_项目中:

<tr>
<% if local_assigns[:group].present?  %>
  <td rowspan="<%= size %>"><%= group %></td>
<% end %>
rest of the partial....
</tr>

注意:刚刚写在这里..可能包含也可能不包含语法错误。

于 2009-12-31T00:01:19.897 回答
0

您可以尝试的一种解决方案...首先,获取每个排序键所需的所有行跨度的哈希值。

@rowspans = TestItem.count(:group => sortkey)

然后,在部分中,当您渲染每一行时,设置一个实例变量以检查您是否使用当前排序键渲染行......

<% if testitem.sortkey != @current_sort_key %>
  <% @current_sort_key = testitem.sortkey %>
  <td rowspan="<%= @rowspans[@current_sort_key] -%>">
    <%= testitem.sortkey %>
  </td>
<% end %>
... render the rest of row ...

根据您希望视图的干净程度,这可能最好写在帮助器内部,而不是视图本身。

于 2009-12-30T23:05:21.413 回答