2010-02-14 15 views
17

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?Numero limite di oggetti in has_many association

+1

controllo il conteggio prima di inserire? –

+1

probabilmente non è il più carino di tutti, ma il più sicuro è @Marcel Jackwerth sulution, altri con l'uso di 'validates_associated' ti permettono di creare figli senza limite usando' parent.children.create' –

risposta

6

Come aggiungere un metodo di convalida personalizzato al modello Foto?

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 
+1

grazie a @Marcel Jackwerth! passare un po 'di tempo in 'rails console' controllando tutte e 3 le soluzioni, ho scoperto che il tuo è l'unico che impedisce davvero di creare" bambini indesiderati ")) –

26

Utilizzare un gancio di convalida:

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 
+0

Grazie per il consiglio ragazzi. Ho il codice di Marcel funzionante. – chief

+1

photos.size è un modo migliore per andare - http://blog.hasmanythrough.com/2008/2/27/count-length-size, da una domanda simile - http://stackoverflow.com/a/4836927/ 1396904 – andorov

+0

Modificato come suggerito, @andorov – hurikhan77

22

Nel mio caso, è stato sufficiente usare 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

Questa è la soluzione più pulita – fernandohur

+1

Posso confermare che questo funziona davvero bene. L'unico problema è che se vai nella direzione opposta e inizi a creare un gruppo di "Foto" che appartengono all'album, lo stesso non può dirsi. Dovrai aggiungere: validate => true a belongs_to, anche se non l'ho testato per assicurarmi che funzioni sempre come previsto. – rovermicrover

+1

effettivamente 'appartiene_album: validate: true' secondo http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to controlla le associazioni sul genitore salva, non su child save. .. così puoi aggiungere quanti figli vuoi e questo potrebbe essere un problema –

Problemi correlati