【问题标题】:Using has_many / belongs_to to access info in controller - Ruby on Rails使用 has_many / belongs_to 访问控制器中的信息 - Ruby on Rails
【发布时间】:2012-06-18 15:13:39
【问题描述】:

这可能是一个非常简单的问题,我很抱歉 - 我是 Rails 新手。

我有 2 个控制器 - 客户和订单。我已经知道了,当客户下订单时,他们的 id 被传递到一个隐藏字段中,以便订单表中的 customer_id 字段具有他们的 id。所以所有订单都有下订单的客户的 ID。我想要做的是让客户的显示视图显示他们的所有订单 - 所以所有订单都有他们的 id。

我有客户有_许多订单和订单属于客户等。我如何引用客户/订单来提取正确的信息?我是否需要在控制器的显示操作中添加额外的信息?我已经尝试了我能想到的一切!到目前为止,我已经能够获得所有信息的哈希值以显示在显示视图中,但我无法让个别信息位出现 - 例如order.price.

我基本上想要客户显示视图中的订单详细信息表 - 订单价格、放置日期等。任何帮助将不胜感激,谢谢!

编辑:我现在有了这个 - 但无法让 line_items 位工作。关系是这样工作的:客户有很多订单,订单有很多行项目,行项目属于产品。我怀疑它不工作的原因是因为belongs_to。

<% @customer.orders.each do |order| %>
    <% order.line_items.each do |line_item| %>
        <tr>
            <td><%= line_item.created_at %></td>
                <% line_item.products.each do |product| %>
                    <td> <%= product.name %></td>
                <% end %>
            <td><%= order.email %></td>
        </tr>
    <% end %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails view has-many controllers belongs-to


    【解决方案1】:

    您不需要向控制器 show 操作添加任何内容。

    在您的客户show 视图中,您大概可以访问@customer 对象。由于您的 has_many,这将有一个集合 @customer.orders。因此,在视图中,您可以执行类似的操作

    <table>
    <thead>
       <td>Item</td>
       <td>Quantity</td>
       <td>Price</td>
       <td>Date Placed<td>
    </thead>
    
    <% @customer.orders.each do |order| %>
    <tr>
       <td><%= order.item.name %></td>
       <td><%= order.quantity %></td>
       <td><%= order.price %></td></tr>
       <td><%= order.date_placed %></td>
    </tr>
    <% end %>
    
    </table>
    

    显然我正在编造你想要显示的可能的 order 字段,但这应该会给你这个想法。

    【讨论】:

    • 谢谢!就是这样!此外,如果我想显示订单中的单个项目(使用我拥有的 line_items 控制器),我是否只需将“has_many :line_items, through: :orders”放在客户模型中,然后将其引用为 order.line_item。姓名?
    • 您可能不想为 line_items 为客户添加has_many through,因为 line_items 仅在他们的订单上下文中才有意义(has_many through 会让客户拥有一个大桶line_items 独立于订单)。如果 order has_many line_items,那么,当您遍历订单(如上)并具有给定的订单时,您可以执行 order.line_items.each do |line_item| 并将这些作为循环中的循环进行迭代。
    • 请您发布嵌套循环的代码 - 我已经尝试了各种方法,但我收到了错误消息!非常感谢!
    • 我现在不得不在一个循环中嵌套一个循环 - 这甚至可能吗!?我现在陷入困境,因为客户有很多订单,而且订单有很多订单项。行项目属于产品 - 我如何在代码中引用它!?我有 order.line_items.each,那我怎么去产品? line_item.products.each 不起作用:谢谢!
    • 1) 嵌套循环的数量没有固有限制,但它很快就会变得混乱。 2) line_item 通常不会只有一种产品吗?如果它是belongs_to 关系,它只是line_item.product。要考虑的一个选项是创建一个助手,例如,它将接受订单并返回其所有 line_items 和产品的渲染;然后您可以在视图中引用该助手,这样视图就不会变得那么混乱。
    【解决方案2】:

    在你的表演动作中:

      def show
        @customer = Customer.find(params[:id])
      end
    

    在你的 routes.rb 中:

    resources :customers
    

    在你看来:

    <table>
    <% @customer.orders.each do |order| %>
      <tr>
        <td><%= order.id %></td>
        <td><%= And Other Your Order Fields %></td>
      </tr>
    <% end %>
    </table>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多