has_many .build 关联 .build 没有在 DB for Rails 6.1 中保存对象

has_many association .build is not saving object in DB for Rails 6.1

提问人:Faisal 提问时间:9/12/2023 最后编辑:Faisal 更新时间:11/15/2023 访问量:136

问:

我正在升级到 Rails 6.1,并且在我的模型中具有以下关联

class Product < ApplicationRecord
  has_many :classifications, dependent: :destroy
  has_many :order_lines, dependent: :destroy
end

对于以下代码片段:

p = Product.new
p.classifications.build name: 'my name'
p.order_lines.build line_number: '123'
p.save

如果我在现有的代码环境(Rails 6.0、Ruby 2.7.7)中运行它,它会按预期工作。但是,如果我针对 Rails 6.1 运行它,则对象将存储在数据库中,而 将被丢弃。没有 SQL 语句尝试将其写入数据库,并且在保存后检查,返回一个空的 . 更改我们构建对象的顺序没有影响。更改模型中定义关联的顺序确实会更改行为(持久化,但未保留)classificationsorder_linep.order_lines.inspectCollectionProxyorder_lineclassifications

有趣的是,如果我切换到

p = Product.create # instead of .new
# rest of snippet

它在 Rails 6.1 上按预期工作,并且两者都被存储。这是非常令人困惑的行为,我不知道是什么引入了它。有什么想法吗?order_lineclassification

编辑:该行为与我在任何模型上定义的任意两个关联一致。模型中首先定义的关联将被保存,而另一个关联将被删除。我尝试交换它们并重新加载我的控制台,保存与丢弃的控制台被交换了。has_many

Ruby-on-Rails 活动记录 Ruby-on-Rails-6.1

评论

1赞 max 9/12/2023
你是想写吗?您当前正在调用方法,而不是传递哈希。 也只是一个别名,由于遗留原因而存在。p.order_lines.build line_number: '123'buildnew
0赞 Faisal 9/13/2023
哦,好抓...是的,我的意思是传递一个哈希值。
0赞 max 9/13/2023
尝试运行以查看是否有任何验证失败。我假设它是产品和订单之间的连接表是对的吗?在这种情况下,我猜它无法保存,因为它需要订单。p.order_lines.errors.full_messages
0赞 Faisal 9/13/2023
仔细检查,这不是验证问题。奇怪的是,如果我重复所有步骤,只需切换到它就可以工作了,这进一步支持了这与验证无关。Product.newProduct.create
1赞 Alex 11/15/2023
无法重现此内容,这是您没有答案的唯一原因。你能从,因为这就是我在回答硬调试问题时开始的方式。您显示的代码在 和 中对我有用。bin/rails _6.1.0_ new myapprails v6.0.0rails v6.1.0

答: 暂无答案