penso che è possibile convalidare con l'utilizzo di .reject(&:marked_for_destruction?).length
.
Che ne dici di questo?
class User < ActiveRecord::Base
has_many :groups do
def length
reject(&:marked_for_destruction?).length
end
end
accepts_nested_attributes_for :groups, allow_destroy: true
validates :groups, length: { maximum: 5 }
end
O questo.
class User < ActiveRecord::Base
has_many :groups
accepts_nested_attributes_for :groups, allow_destroy: true
GROUPS_MAX_LENGTH = 5
validate legth_of_groups
def length_of_groups
groups_length = 0
if groups.present?
groups_length = groups.reject(&:marked_for_destruction?).length
end
errors.add(:groups, 'too many') if groups_length > GROUPS_MAX_LENGTH
end
end
Quindi, è possibile comandare.
@user.assign_attributes(params[:user])
@user.valid?
Grazie per la lettura.
Riferimenti:
http://homeonrails.com/2012/10/validating-nested-associations-in-rails/ http://qiita.com/asukiaaa/items/4797ce44c3ba7bd7a51f
avrei probabilmente usare 'tags.count' in modo che il DB fa il lavoro e non si carica tutti i tag solo per questo uno convalida. –
@Beerlington: In effetti sembra che Nikita abbia ragione, non vuoi colpire il database per una convalida, vuoi controllare la lunghezza effettiva dei "tag" dell'oggetto. – tokland
Se si utilizza tag.size, fa la cosa "giusta". vedere http://blog.hasmanythrough.com/2008/2/27/count-length-size –