0

私はモデルを持っています:

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 オブジェクトと一緒に関係の長さを検証する正しい方法は何ですか?

(もちろん、カスタムバリデータなしで...)

4

1 に答える 1

0

唯一の選択肢は、カスタム バリデータを作成することです。

これは未解決のバグであり、それを修正するための PR がありますが、彼らは何ヶ月もそこに座っていました:

https://github.com/rails/rails/issues/7247

https://github.com/rails/rails/pull/9917

于 2013-09-09T21:07:56.820 に答える