Limita il numero di oggetti in has_many association

Ho un album che ha_molte foto. Un’installazione counter_cache aggiorna la colonna photos_count nella tabella degli album. Come posso limitare il numero di foto per un album?

Usa un hook di validazione:

 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 

Nel mio caso, è stato sufficiente utilizzare validates_length_of :

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

Che ne dici di aggiungere un metodo di convalida personalizzato al modello Photo?

  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 
 ActiveRecord::Base.transaction do ActiveRecord::Base.connection.execute('LOCK TABLE pictures IN EXCLUSIVE MODE') if (@album.pictures.count < 10) @album.pictures.create() end end 

Credo che questa sia la soluzione più corretta. Protegge da problemi di concorrenza / condizioni di gara.