복붙노트

[RUBY-ON-RAILS] has_many 협회의 개체 수 제한

RUBY-ON-RAILS

has_many 협회의 개체 수 제한

나는 사진을 has_many 앨범을 가지고있다. counter_cache 설정 앨범 테이블의 photos_count 열을 업데이트합니다. 어떻게 앨범을위한 사진의 수를 제한 할 수 있습니까?

해결법

  1. ==============================

    1.내 경우, validates_length_of 사용하기에 충분했다 :

    내 경우, validates_length_of 사용하기에 충분했다 :

    class Album
      has_many :photos
      validates_length_of :photos, maximum: 10
    end
    
    class Photo
      belongs_to :album
      validates_associated :album
    end
    
  2. ==============================

    2.검증 후크를 사용하여

    검증 후크를 사용하여

    class Album
      has_many :photos
      validate_on_create :photos_count_within_bounds
    
      private
    
      def photos_count_within_bounds
        return if photos.blank?
        errors.add("Too many photos") if photos.size > 10
      end
    end
    
    class Photo
      belongs_to :album
      validates_associated :album
    end
    
  3. ==============================

    3.어떻게 사진 모델에 지정 유효성 검사 방법을 추가하는 방법에 대한?

    어떻게 사진 모델에 지정 유효성 검사 방법을 추가하는 방법에 대한?

      LIMIT = 50
    
      validate_on_create do |record|
        record.validate_quota
      end
    
      def validate_quota
        return unless self.album
        if self.album.photos(:reload).count >= LIMIT
          errors.add(:base, :exceeded_quota)
        end
      end
    
  4. ==============================

    4.

    ActiveRecord::Base.transaction do
      ActiveRecord::Base.connection.execute('LOCK TABLE pictures IN EXCLUSIVE MODE')
      if (@album.pictures.count < 10) 
        @album.pictures.create()
      end
    end
    

    나는 이것이 가장 정확한 솔루션입니다 생각합니다. 그것은 동시성 문제 / 경쟁 상태에 대해 보호합니다.

  5. from https://stackoverflow.com/questions/2263267/limit-number-of-objects-in-has-many-association by cc-by-sa and MIT license