显示属于管理面板上的订单的产品

时间:2016-12-21 22:52:01

标签: ruby-on-rails ruby associations

我正在尝试在管理员面板上显示属于某个订单的每个产品的名称,但我似乎无法得到它。

这是我的协会:

 OrderItem belongs_to :product
 OrderItem belongs_to :order
 Product has_many :order_items
 Order has_many :order_items

我尝试了两件不同的事情:

<tbody>
    <% @orders.each do |order| %>
      <tr>
        <td><%= order.id %></td>
         <td><%= order.order_items.product.name %></td>
         <td><%= order.total %></td>
      </tr>
    <% end %>
  </tbody>

这给我带来了这个错误:

undefined method `name' for #<Array:0x0000000535fbb0>

然后我尝试像这样循环:

<tbody>
    <% @orders.each do |order| %>
      <tr>
        <td><%= order.id %></td>
            <% order.order_items each do |order_item| %>
                <% order_item.products each do |product| %>
                    <td><%= product.name %></td>
                <% end %>
             <% end %>
         <td><%= order.total %></td>
      </tr>
    <% end %>
  </tbody>

我收到了这个错误:

undefined local variable or method `each' for <Class:0x007fce540aa3f0>:0x007fce5417fed8>

这是我的控制器代码:

  def orders
      @orders = Order.all
      @order_items = OrderItem.all
      @products = Product.all
  end

我不知道我哪里出错了任何帮助都会受到赞赏,谢谢。

1 个答案:

答案 0 :(得分:1)

你可以用你建议的任何一种方式做到这一点:只关注你的收藏品和物品

第一种方式:

这个项目会将您的所有项目放在一个<td>

<tbody>
  <% @orders.each do |order| %>
    <tr>
      <td><%= order.id %></td>
       <td><%= order.order_items.map{ |o| o.product.name }.join(', ') %></td>
       <td><%= order.total %></td>
    </tr>
  <% end %>
</tbody>

第二种方式:

此处,每个order_item都有自己的<td>

<tbody>
  <% @orders.each do |order| %>
    <tr>
      <td><%= order.id %></td>
          <% order.order_items each do |order_item| %>
              <td><%= order_item.product.name %></td>
           <% end %>
       <td><%= order.total %></td>
    </tr>
  <% end %>
</tbody>

您可以考虑在模型中长期添加一些has_many throughdelegate关系 - 这会使这种关联更加整洁。