Validate the number of has_many items in Ruby on Rails

前端 未结 3 1043
走了就别回头了
走了就别回头了 2020-11-28 06:48

Users can add tags to a snippet:

class Snippet < ActiveRecord::Base

  # Relationships
  has_many :taggings
  has_many :tags, :through => :taggings
  b         


        
相关标签:
3条回答
  • 2020-11-28 07:00

    You can always create a custom validation.

    Something like

      validate :validate_tags
    
      def validate_tags
        errors.add(:tags, "too much") if tags.size > 5
      end
    
    0 讨论(0)
  • 2020-11-28 07:10

    A better solution has been provided by @SooDesuNe on this SO post

    validates :tags, length: { minimum: 1, maximum: 6 }
    
    0 讨论(0)
  • 2020-11-28 07:14

    I think you can validate with using .reject(&:marked_for_destruction?).length.

    How about this?

    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
    

    Or this.

    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.exists?
          groups_length = groups.reject(&:marked_for_destruction?).length
        end
        errors.add(:groups, 'too many') if groups_length > GROUPS_MAX_LENGTH
      end
    end
    

    Then, you can command.

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

    Thank you for reading.

    References:

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

    0 讨论(0)
提交回复
热议问题