簡體   English   中英

如果更新無效,則跳過保存關聯對象

[英]Skip saving associated object if invalid on update

我有一個像這樣的人表和地址表:

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配置):

  • 首先只更新用戶的屬性
  • 在用戶上調用 save (因此地址不會弄亂更新)
  • 設置地址屬性
  • 調用用戶保存(所以一切都會再次驗證)

編輯:如果您想使用validate: false選項,您可能還想設置autosave: false以便您不保存無效地址https://guides.rubyonrails.org/association_basics.html#options-for-has-many -自動保存

最終,您要么要檢查地址屬性是否有效,如果無效則將其刪除,或者單獨保存記錄。

一個常見的模式是使用表單對象選擇第二個選項。 這有助於將邏輯排除在控制器之外,並使將來更容易擴展更新Person

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM