私はモデルを持っています:
class Purchase < ActiveRecord::Base
has_many :purchase_items, dependent: :destroy
accepts_nested_attributes_for :purchase_items, reject_if: :all_blank, allow_destroy: true
validates_length_of :purchase_items, minimum: 1
end
そして PurchaseItem で:
class PurchaseItem < ActiveRecord::Base
belongs_to :purchase
end
1 つのアイテムだけを購入したとします。次のようにしてアイテムを破棄するようにマークした場合:
purchase.purchase_items.first.mark_for_destruction
purchase.save!
購入は正常に保存され、DB に参照項目がありません。
ActiveModel::Validations::LengthValidator 内の validate_each メソッドを調べると、検証対象の値に破棄のマークが付けられたオブジェクトがあるかどうかを検証していないことがわかります。
https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/length.rb
それは正常な動作ですか、それとも実際に問題ですか? もし正常であれば、marked_for_destruction オブジェクトと一緒に関係の長さを検証する正しい方法は何ですか?
(もちろん、カスタムバリデータなしで...)