我有一种方法可以将产品添加到cart
。现在每个产品都可以有product_attributes
。基本上我想要的是检查具有相同属性的产品是否已添加到购物车中。如果是这样,我想将其数量增加1.如果没有,我想将该产品的附加属性添加到购物车中。
这里的重要因素是我需要检查具有相同ID的产品line_item_attributes
,看看它们的属性是否匹配。
def add_product(product_id, instruction, attributes)
values = attributes.values
attribute_values = values.map { |attribute| attribute[:product_attribute_id].to_i }.compact
similar_items = line_items.where(product_id: product_id)
similar_items.each do |item|
if item.line_item_attributes.map(&:product_attribute_id).sort == attribute_values.sort
item.quantity += 1
end
end
end
这就是我到目前为止,属性本质上是这样的哈希:
{"0"=>{"product_attribute_id"=>"4"}, "1"=>{"product_attribute_id"=>"7"}}
现在如果我尝试使用我的创建操作保存它,我会收到此错误:
undefined method `save' for []:Array
这是我的控制器创建动作
def create
product = Product.find(params[:line_item][:product_id])
instruction = params[:line_item][:instruction]
attributes = params[:line_item][:line_item_attributes_attributes].to_unsafe_h
@line_item = @cart.add_product(product.id, instruction, attributes)
respond_to do |format|
if @line_item.save
format.html { redirect_to store_url(product.store), notice: 'Line item was successfully created.' }
format.js { @current_item = @line_item }
format.json { render :show, status: :created, location: @line_item }
else
format.html { render :new }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:0)
Ruby有隐含的回报。这意味着方法中的最后一个对象将是返回值。方法中的最后一个对象是一个可枚举的(每个),其返回值是被迭代的集合。由于where返回一个数组,因此您将使用add_product方法返回一个数组。