【发布时间】:2017-06-14 08:41:24
【问题描述】:
我的 LineItem 模型中有一个唯一性约束,如下所示:
class LineItem < ApplicationRecord
# this add uniqueness validation to [cart_id + product_id] together
validates :cart_id, uniqueness: { scope: [:product_id] }
end
为了提高安全性,我还为数据库中的这些列添加了索引 + unique:true
在我的LineItemsController#create 我有以下内容
class LineItemsController < ApplicationController
def create
@cart = Cart.find(session[:cart_id]
product = Product.find(params[:product_id]
@line_item = @cart.add_product(product, params[:licence])
respond_to do |format|
@line_item.save!
format.html { redirect_to products_url }
format.js
rescue ActiveRecord::RecordNotUnique
@cart.line_items
.find_by(product_id: params[:product_id])
.update(licence_type: params[:licence], price: product.price)
format.js
end
end
end
我想要做的是:如果用户添加一个已经具有相同 product_id 和 cart_id 的行项目,则使用 params[:licence] 更新 licence_type 列
我为此使用rescue ActiveRecord::RecordNotUnique:
1 - 这是一个好方法吗(这样我可以为自己保存一个额外的请求,每次检查数据库中是否存在记录)?
2 - 我如何捕捉除 ActiveRecord::RecordNotUnique 之外的任何其他异常/错误?我想在底部添加另一个rescue Exception => e,这样我就可以捕获所有其他异常,但我想我在某处读到这样的一般异常并不好,我应该改用rescue => e 之类的东西?
感谢任何代码 sn-p,谢谢!
【问题讨论】:
标签: ruby-on-rails activerecord