我怎么能记住部分渲染器中的某个状态?
手头的问题:我的部分_testitem.html.erb
呈现了一组testitems的表行。 Testitem
有id
和sortkey
,部分用
<%= render :partial => "testitem", :collection => @testbox.testitems.sort_by{|x| [x.sortkey, x.id]} %>
即。所有测试项目都按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
这个事实?
感谢您帮助我。
答案 0 :(得分: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 partial:
<%= h item.sort_key %>
我不完全确定这会给你准确的目标,但它会为你提供一个良好的开端。
答案 1 :(得分: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 %>
_item中的:
<tr>
<% if local_assigns[:group].present? %>
<td rowspan="<%= size %>"><%= group %></td>
<% end %>
rest of the partial....
</tr>
注意:只是在这里写了..可能包含也可能不包含语法错误。
答案 2 :(得分: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 ...
根据您对视图的干净程度,这可能更好地写在帮助程序内,而不是在视图本身中。