Ограничить количество объектов в ассоциации has_many - PullRequest
20 голосов
/ 15 февраля 2010

У меня есть альбом, в котором есть много фотографий. Настройка counter_cache обновляет столбец photos_count в таблице альбомов. Как ограничить количество фотографий для альбома?

Ответы [ 4 ]

29 голосов
/ 15 февраля 2010

Использовать проверочный хук:

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
28 голосов
/ 21 мая 2015

В моем случае было достаточно использовать validates_length_of:

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

class Photo
  belongs_to :album
  validates_associated :album
end
6 голосов
/ 15 февраля 2010

Как насчет добавления пользовательского метода проверки к модели 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
0 голосов
/ 04 апреля 2018
ActiveRecord::Base.transaction do
  ActiveRecord::Base.connection.execute('LOCK TABLE pictures IN EXCLUSIVE MODE')
  if (@album.pictures.count < 10) 
    @album.pictures.create()
  end
end

Я считаю, что это самое правильное решение. Он защищает от проблем параллелизма / условий гонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...