试着不要重复使用Rails数据操作

时间:2012-10-23 23:52:56

标签: ruby-on-rails dry

我对rails很新,一般是一名中级程序员,但我会尽量清楚。

我有一个Products数据库表,它拥有一个名为category的字段。类别有两个可能的值,称为Category1和Category 2.目标是检索所有产品并将其显示在按类别组织的HTML中。我可以做到这一点,但我知道必须有更好的方法。

我现在的方法是让我的产品如此:

@category1_products = Product.all(conditions: { category: "Category1" })
@category2_products = Product.all(conditions: { category: "Category2" })

然后输出如下数据:

<table>
<tr>
  <td>Category1 Name</td>
<% @category1_products.each do |product| %>
  <td><%= product.name %></td>
  <td><%= product.description %></td>
  <td><%= product.price %></td>
<% end %>
</tr>
<tr>
  <td>Category2 Name</td>
<% @category2_products.each do |product| %>
  <td><%= product.name %></td>
  <td><%= product.description %></td>
  <td><%= product.price %></td>
<% end %>
</tr>
</table>

我想使用单个实例来完成此操作:立即获取所有产品,按类别对它们进行分组,然后通过一次循环一个类别(包括类别名称)来输出它们。这对我来说似乎是一个非常基本的概念,但我无法理解它。

2 个答案:

答案 0 :(得分:1)

Rails'group_by非常适合此类问题:

@grouped_products = Product.all.group_by(&:category)

然后在视图中,只需循环@grouped_products

<table>
  <tr>
  <% @grouped_products.each do |category, products| %>
    <td><%= category %></td>
    <% products.each do |product| %>
      <td><%= product.name %></td>
      <td><%= product.description %></td>
      <td><%= product.price %></td>
    <% end %>
  <% end %>
  </tr>
</table>

答案 1 :(得分:1)

@products_by_category = Product.all.group_by(&:category)

这是一个Ruby(读取:非ActiveRecord)方法,根据它包含的对象的某些条件将数组转换为哈希。

在您的视图中(假设您希望每个产品一行,而不是每个类别一行):

<table>
  <% @products_by_category.each do |category,products| %>
    <tr>
      <th><%= category %></th>
    </tr>
    <% products.each do |product| %>
      <tr>
        <td><%= product.name %></td>
        <td><%= product.description %></td>
        <td><%= product.price %></td>
      </tr>
    <% end %>
  <% end %>
</table>