限制has_many关联中的对象数

时间:2010-02-14 23:20:43

标签: ruby-on-rails

我有一张有很多照片的专辑。 counter_cache设置会更新相册表中的photos_count列。如何限制相册的照片数量?

4 个答案:

答案 0 :(得分:29)

使用验证钩子:

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

答案 1 :(得分:28)

就我而言,只需使用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 :(得分: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

答案 3 :(得分:0)

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

我相信这是最正确的解决方案。它可以防止并发问题/竞争条件。