through references rails many includes has_one has_many has_and_belongs_to_many has example belongs and accepts_nested_attributes_for ruby-on-rails ruby-on-rails-3

ruby on rails - references - Rails has_many mínimo validación de actualización de tamaño de colección



rails has_one through (3)

Crear validador:

class CollectionLengthValidator < ActiveModel::Validations::LengthValidator def validate_each(record, attribute, value) value = value.respond_to?(:reject) ? value.reject(&:marked_for_destruction?) : value super(record, attribute, value) end end

Esto es resolver el problema con eliminar el último registro de la colección.

Luego usar en el modelo como validador de longitud estándar:

validates :foos, :collection_length => {:minimum => 1}

Tengo una asociación has_many que acepta atributos anidados. Necesito que haya un mínimo de 1 objeto asociado en la colección, así que escribí un validador personalizado:

class MinimumCollectionSizeValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) if value.size < options[:size] record.errors[attribute] << (options[:message] || "must have at least #{options[:size]} line.") end end end

El modelo se parece a:

has_many :foos, :dependent=>:destroy accepts_nested_attributes_for :foos validates :foos, :minimum_collection_size=>{:size=>1}

Esto funciona muy bien en la creación del modelo, pero falla en la actualización. @my_model.update_attributes(params[:my_model]) devuelve true incluso si todos los foos son eliminados por _destroy.

¿Cómo consigo que update_attributes comporte igual que save ?


SooDesuNe

Sí, validates :foos, :length => {:minimum => 1, :message=>"At least one foo" } es mejor que el original, pero el mismo problema sigue ocurriendo.

Para solucionarlo, podríamos utilizar el método de validación:

validate :validate_foos private def validate_foos remaining_foos = foos.reject(&:marked_for_destruction?) errors.add :foos, "At least one foo" if remaining_foos.empty?

Espero que ayude a quien se encontró con el mismo problema.


Una mejor manera de validar el tamaño mínimo de una colección:

validates :my_association, :length => { :minimum => Fixnum}