2010-02-14 27 views
17

我有一張擁有has_many照片的相冊。 counter_cache安裝程序更新專輯表中的photos_count列。我如何限制專輯的照片數量?has_many association中的對象數量限制

+1

檢查計數插入之前? –

+1

可能不是最可愛的,但最安全的是@Marcel Jackwerth sulution,其他使用'validates_associated'的人可以讓你用'parent.children.create'創建無限制的孩子! –

回答

6

如何將自定義驗證方法添加到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 
+1

謝謝@Marcel Jackwerth!花一些時間在'rails console'檢查所有3個解決方案,發現你的是唯一真正阻止創建「不想要的孩子」)) –

26

使用驗證掛鉤:

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

感謝您的建議傢伙。我有Marcel的代碼工作。 – chief

+1

photos.size是一個更好的方式去 - http://blog.hasmanythrough.com/2008/2/27/count-length-size,從一個類似的問題 - http://stackoverflow.com/a/4836927/ 1396904 – andorov

+0

按照您的建議修正@andorov – hurikhan77

22

對我來說,這是足夠使用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

這是最乾淨的解決方案 – fernandohur

+1

可以證實這一點非常好。唯一的問題是,如果你走另一條路,並開始創建一堆屬於專輯的「照片」,就不能說了。您需要爲belongs_to添加:validate => true,儘管我沒有測試過以確保它始終按照預期工作。 – rovermicrover

+1

根據http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to實際上'belongs_to:album,validate:true'檢查父保存上的關聯,而不是子保存。 ..所以你可以添加儘可能多的孩子,這可能是一個問題 –

相關問題