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}