如何在显式保存前更新未存储的PortStock实例且不提前入库?
解决方法:直接赋值属性,避免提前触发持久化
你遇到的问题核心在于@port_stock.update!的特性——这个方法会立即将对象的变更持久化到数据库,所以调用它之后,@port_stock已经被提前保存了一次,后续执行@port_stock.save自然会触发两次回调,进而导致数据异常。
要在显式调用save前更新属性且不提前保存对象,直接给内存中的对象赋值即可,因为新建的PortStock实例还未被持久化到数据库:
@portfolio = current_user.portfolio @port_stock = PortStock.new(port_stock_params) stock = Stock.find(port_stock_params[:stock_id]) # 直接赋值属性,仅在内存中修改,不会触发数据库保存 @port_stock.current_price = stock.price respond_to do |format| if @port_stock.save # 你的后续业务逻辑 end end
如果需要批量更新多个属性,也可以使用assign_attributes方法,同样不会触发保存操作,代码会更整洁:
@port_stock.assign_attributes(current_price: stock.price, other_attribute: value)
另外补充:如果需要验证属性赋值后的对象是否符合规则,可以调用@port_stock.valid?,这个方法只会检查验证逻辑,不会触发持久化。
内容的提问来源于stack exchange,提问作者marcamillion
相关产品推荐
相关产品推荐

