You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在显式保存前更新未存储的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:29:15