如果在更新时无效,则跳过保存关联的对象



我有一个人员表和地址表,如下所示:

class Person < ApplicationRecord
has_many :addresses, dependent: :destroy
accepts_nested_attributes_for :addresses
end
class Address < ApplicationRecord
belongs_to :person
validates :address_line_1, presence: true
end

在我的控制器中,我想更新人员和关联的地址,但如果地址无效且人员有效,我仍然希望更新 Person 对象并保持无效地址与以前相同,而不会遇到ROLLBACK

处理这个问题的最佳方法是什么?我意识到我可以做一些逻辑来检查地址是否无效并从参数中删除addresses_attributes,然后再次分配参数并保存它,但是有更好的方法吗?

has_many关联有一个validate选项,您可以设置为 false 并根据需要处理验证 https://guides.rubyonrails.org/association_basics.html#options-for-has-many-validate

我认为您正在使用accepts_nested_attributes_for因为您命名了addresses_attributes参数,就我个人而言,我不会将任何验证与此结合起来,您最终可能会得到无效的地址。

就个人而言,我会做两步(使用默认validate: true配置(:

  • 首先仅更新用户的属性
  • 在用户上调用保存(因此地址不会弄乱更新(
  • 设置地址属性
  • 对用户调用保存(以便再次验证所有内容(

编辑:如果要使用validate: false选项,您可能还需要设置autosave: false,以免保存无效地址 https://guides.rubyonrails.org/association_basics.html#options-for-has-many-autosave

最终,您需要检查地址属性是否有效,如果不是,则将其删除,或者单独保存记录。

一种常见的模式是使用表单对象选择第二个选项。这有助于将逻辑排除在控制器之外,并使将来更新Person时更容易扩展。

最新更新