增加篮子项目Ruby

时间:2016-04-06 17:26:24

标签: sql ruby-on-rails ruby methods logic

我正在尝试编写一些逻辑,用于评估项目是否已存在于购物篮中,以及当用户添加产品时是否将项目数量增加1,如果没有创建新记录(创建新记录)位运行良好。)

def create  
   @product = Product.find(params[:product_id])
   @basket = current_basket

    if @basket.items.exists?(product_id: @product.id)
        current_basket.items.find(conditions: {:product_id => @product.id}).increment! :quantity
    else
        Item.create!(basket_id: @basket.id, product_id: @product.id, quantity: 1, price: @product.price)
    end

    redirect_to baskets_show_path

end

我得到的错误是SQLite3::SQLException: no such column: id.conditions: SELECT "items".* FROM "items" WHERE "items"."basket_id" = ? AND "id"."conditions" = '--- :product_id: 2 ' LIMIT 1

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试使用find_by代替条件:

def create  
   @product = Product.find(params[:product_id])
   @basket = current_basket

    if @basket.items.exists?(product_id: @product.id)
        current_basket.items.find_by(product_id: @product.id).increment! :quantity
    else
        Item.create!(basket_id: @basket.id, product_id: @product.id, quantity: 1, price: @product.price)
    end

    redirect_to baskets_show_path

end

答案 1 :(得分:1)

first_or_create可能会有所帮助。见API Dock ActiveRecord::Relation first_or_create。当然,由于项目有多个识别标准,因此您的需求比文档中提供的要复杂得多。

我在我打开的应用程序中使用模型测试了这个,它似乎做了诀窍(模型有很多我不想搞砸的验证,所以我相信实际的创建失败了)。

def create
  @product = Product.find(params[:product_id])
  @basket = current_basket

  item = Item.where({basket_id:  @basket.id,
                     product_id: @product.id,
                     price:      @product.price})
             .first_or_create(quantity: 0)
  item.increment! :quantity

  redirect_to baskets_show_path
end

所以基本上是正在发生的事情,你将项目设置为篮子中的项目(如果它在那里),或者如果它不是你已经在寻找的信息,则创建它,以及初始数量为零。然后,你增加1。

另一个注意事项是您可能想确认您需要两个实例变量。如果视图中只需要@basket,请考虑从所有产品引用中删除@。关于为什么以及如何保持控制器枯瘦的解释是Jumpstart Lab's Slimming Controllers