在每个循环中显示相关记录的正确方法?

时间:2013-02-15 12:22:22

标签: ruby-on-rails has-one

我有两个班级,订单和饮料 - 订单has_one饮料和饮料has_many订单。 Orders表有一个beverage_id字段,在我创建时会正确填充。

然而,我真的很难让饮料的名称显示在Orders#index中,而不仅仅是ID。我觉得我真的过于复杂化了 - 使用这个(基本功能)的铁路中最干净的方法是什么?

控制器:

  def index
    @orders = Order.all
    @beverage = Order.beverage.find(params[:beverage_id])
  end

查看

  - @orders.each do |order|
    %tr
      %td
        = order.created_at
      %td
        = order.orderable_type
      %td
        = order.quantity
        = order.beverage.name

此刻,它只是给了我

  #p>#

的未定义方法`饮料'

我在某处做错了吗?

2 个答案:

答案 0 :(得分:1)

  
    

我有两个班级,订单和饮料 - 订单has_one饮料和饮料has_many订单。

  

你应该:

  • 饮料has_many:orders
  • order belongs_to:bavarage

因此,您的课程可能设置错误。你必须有类似的东西。

 class Beverage < ActiveRecord::Base
   has_many :orders   
 end

 class Order < ActiveRecord::Base
   belongs_to :beverage
 end

否则,order.beverage.name永远不会有效。

您也可以从控制器中删除@beverage = Order.beverage.find(params[:beverage_id]),因为您显然没有使用它。

答案 1 :(得分:1)

按照gabriel的建议设置模型后,您可以执行以下操作:

@orders = Order.includes(:beverage)
# retrieves all orders, including their beverage
# then you can loop through them like you did before

或:

@beverage = Beverage.includes(:orders).find(params[:id])
# retrieves a specific beverage + all its orders