gpt4 book ai didi

ruby-on-rails - belongs_to touch : true not fired on association. 构建和嵌套属性赋值

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:38 26 4
gpt4 key购买 nike

OpenProject应用我们有两种模型:

CustomField

class CustomField < ActiveRecord::Base
has_many :custom_options, -> { order(position: :asc) }, dependent: :delete_all
accepts_nested_attributes_for :custom_options
...
end

CustomOption

class CustomOption < ActiveRecord::Base
belongs_to :custom_field, touch: true
...
end

然后在custom field controller我们通过批量分配修改自定义字段的选项并保存记录:

@custom_field.attributes = get_custom_field_params

if @custom_field.save
...

因为 touch: trueCustomOption 中的 custom_field 关联上配置,所以我希望自定义字段的 updated_at 属性在此时更新,但这并没有发生。日志不显示任何类似于 UPDATE custom_fields SET update_at = .... 的 SQL 请求。对自定义选项本身的更改,无论是添加自定义选项还是修改自定义选项,都会正确保留。

调试显示:

  • 使用 custom_field.custom_options.build 和随后的 custom_field.save 时出现相同的错误行为
  • 使用 custom_field.custom_options.create 时所需的行为
  • 使用 CustomOption.create custom_field: x 时所需的行为
  • 使用 custom_field.custom_option[x].destroy 时所需的行为

我知道我可以通过定义 after_save 回调来解决这个问题,但这种行为真的让我很恼火,因为它出乎意料。

是否需要并记录上述行为?如果是这样,我在哪里可以找到这些信息?

最佳答案

问题是,如果父模型有任何 after_commit 回调(可能还有一些其他的),:touch 会在自动保存相关记录时停止工作,即使回调不是做任何事情。

您的 CustomField 模型具有来自 acts_as_list gem 的 after_commit 回调。这会破坏 :touch

有一个类似的问题https://github.com/rails/rails/issues/26726 .该问题与 accepts_nested_attributes_for 有关,但我确信 accepts_nested_attributes_for 与它无关,至少在您的情况下是这样。

由问题作者 (@ulferts) 添加:

CustomField 中的 custom_options 关联上定义 inverse_of: 'custom_field' 似乎绕过了这个问题,原因不明。

has_many :custom_options,
-> { order(position: :asc) },
dependent: :delete_all,
inverse_of: 'custom_field'

关于ruby-on-rails - belongs_to touch : true not fired on association. 构建和嵌套属性赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46448140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com