group_by显示belongs_to'name'后跟has_many'items'

时间:2012-04-25 18:35:32

标签: ruby-on-rails

我正在尝试显示组名称(product_group),然后显示每个组中的项目(产品)。

<% @products.group_by(&:product_group_id).each do |s|%> 
    <!--need to get group name here ->                                              
    <% s[1].each do |d|%>
    <%= d.product_name%>
    <br>
    <%end%>
<%end%>

rails 2.3.8

2 个答案:

答案 0 :(得分:2)

首先,我强烈建议您在块中使用两个变量。当您使用一个变量时,group_by将变量设置为应该设置为两个变量的值对的数组。代码要比用该组的[1]编制索引要清晰得多。

一种方法是该对的第一部分将是id,因此您可以进行查找。

<% @products.group_by(&:product_group_id).each do |product_group_id, products|%> 
  <!--need to get group name here -->
  <%= ProductGroup.find(product_group_id).name %>

  <% products.each do |product|%>
    <%= product.product_name%>
    <br>
  <% end %>
<% end %>

另一种方法是,由于您在组中至少有一个产品数组,您可以在数组的第一个元素上调用product_group关联。

<% @products.group_by(&:product_group_id).each do |product_group_id, products|%> 
  <!--need to get group name here -->
  <%= products[0].product_group.name %>

  <% products.each do |product|%>
    <%= product.product_name%>
    <br>
  <% end %>
<% end %>

您也可以将名称委托给产品组。

class Product
  belongs_to :product_group
  delegate :name, :to => :product_group, :prefix => true, :allow_nil => true
end


<%= products[0].product_group_name %>

答案 1 :(得分:0)

在块声明中需要两个变量。第一个用于分组的东西,第二个用于保存每个组中的东西。

<% @products.group_by(&:product_group_id).each do |group_id, group_products| %>
  Group ID: <%= group_id %>
  <br>
  Products:
  <% group_products.each do |product| %>
    <%= product.product_name %>
  <% end %>
<% end %>