我正在尝试产品数量-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
答案 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。