如何修复#<lineitem :: activerecord_relation:0x0000000017b22f70>的未定义方法`product'

时间:2019-04-24 11:09:30

标签: ruby-on-rails ruby ruby-on-rails-5

我正在尝试产品数量-1,但是我收到此错误

line_item.rb

belongs_to :order
belongs_to :product

payment.rb

has_many :orders

#LineItem :: ActiveRecord_Relation:0x0000000017b22f70的未定义方法`product'

@line_item = LineItem.where(:order_id => params[:zc_orderid])
        @line_item.product.quantity = @line_item.product.quantity - 1
        if @line_item.product.quantity == 0
          @line_item.product.sold = true
        end
        @line_item.product.save

3 个答案:

答案 0 :(得分:3)

如果使用where,则不会得到单个LineItem对象,而只会得到LineItem::ActiveRecord_Relation对象。如果该条件足以获得一个记录,则使用find_by。如果不是这样,您将需要更多地考虑逻辑,因为您将获得多个对象。

@line_item = LineItem.find_by(:order_id => params[:zc_orderid])

如果您想减少所有这些订单项的数量,我会做类似的事情

LineItem.transaction do
  LineItem.where(:order_id => params[:zc_orderid]).each do |line_item|
    line_item.product.quantity = line_item.product.quantity - 1
    if line_item.product.quantity == 0
      line_item.product.sold = true
    end
    line_item.product.save
  end
end

答案 1 :(得分:0)

LineItem.where(:order_id => params[:zc_orderid])以数组格式返回。

因此您可以通过以下方式获取 LineItem.find_by(order_id: params[:zc_orderid])。其返回的单个活动记录

答案 2 :(得分:0)

由于Order有许多LineItem,因此您应该期望多于一行,所以应该重写代码:

LineItem.where(:order_id => params[:zc_orderid]).each do |line_item|
  product = line_item.product
  product.quantity -= 1
  if product.quantity == 0
    product.sold = true
  end
  product.save
end

顺便说一句,考虑添加一个Transaction