Valide o número de itens has_many no Ruby on Rails

Os usuários podem adicionar tags a um snippet:

class Snippet  :taggings belongs_to :closing_reason end 

Quero validar o número de tags: pelo menos 1, no máximo 6. Como estou prestes a fazer isso? Obrigado.

Você sempre pode criar uma validação personalizada .

Algo como

  validate :validate_tags def validate_tags errors.add(:tags, "too much") if tags.size > 5 end 

Uma melhor solução foi fornecida pelo @SooDesuNe neste post do SO

 validates :tags, length: { minimum: 1, maximum: 6 } 

Eu acho que você pode validar usando .reject(&:marked_for_destruction?).length .

Que tal agora?

 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 

Ou isto.

 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 

Então, você pode comandar.

 @user.assign_attributes(params[:user]) @user.valid? 

Obrigado por ler.

Referências:

http://homeonrails.com/2012/10/validating-nested-associations-in-rails/ http://qiita.com/asukiaaa/items/4797ce44c3ba7bd7a51f