限制has_many关联中的对象数

chi*_*ief 21 ruby-on-rails

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

jst*_*ada 30

在我的情况下,使用足够validates_length_of:

class Album
  has_many :photos
  validates_length_of :photos, maximum: 10
end

class Photo
  belongs_to :album
  validates_associated :album
end
Run Code Online (Sandbox Code Playgroud)

  • 这是最干净的解决方案 (3认同)
  • 可以确认这确实有效。唯一的问题是,如果您走另一条路并开始创建一堆属于相册的“照片”,则不能说相同。您需要将 :validate => true 添加到 own_to 中,尽管我还没有进行测试以确保这始终按预期工作。 (2认同)
  • 实际上`belongs_to:album,validate:true`根据http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to检查父保存的关联,而不是子保存.所以你可以添加任意数量的孩子,这可能是一个问题 (2认同)

hur*_*n77 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
Run Code Online (Sandbox Code Playgroud)

  • @ hurikhan77我已经检查了它是否没有`_on_create`,但是通过控制台调用`parent.children.create`仍然可以再创建一个`child`并超出限制1(至少对于我的多态关联而言)...我想这里的问题出在`photos.size> 10`上-在验证的那一刻,它是有效的,并且在创建新的`photo`后就变得无效了……虽然这可能只是Rails控制台的问题,但我没有t检查它是否显示相同的行为,然后从应用程序代码中调用`create` (2认同)

Mar*_*rth 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
Run Code Online (Sandbox Code Playgroud)