Проверка Rails acceptpts_nested_attributes count - PullRequest
4 голосов
/ 29 марта 2012

У меня есть три модели. Продажи, предметы и изображения. Я хотел бы подтвердить, что при создании продажи есть как минимум три фотографии на продажу и один или несколько предметов. Каков наилучший способ добиться этого?

Модель продаж:

class Sale < ActiveRecord::Base
   has_many :items, :dependent => :destroy
   has_many :images, :through => :items

   accepts_nested_attributes_for :items, :reject_if => lambda { |a| a[:title].blank? }, :allow_destroy => true
end

Предметы Модель:

class Item < ActiveRecord::Base

  belongs_to :sale, :dependent => :destroy
  has_many :images, :dependent => :destroy

  accepts_nested_attributes_for :images

end

Изображения Модель:

class Image < ActiveRecord::Base
  belongs_to :item, :dependent => :destroy
end

Ответы [ 2 ]

6 голосов
/ 30 марта 2012

Создание пользовательских методов для проверки

В вашей модели продаж добавьте что-то вроде этого:

validate :validate_item_count, :validate_image_count

def validate_item_count
  if self.items.size < 1
    errors.add(:items, "Need 1 or more items")
  end
end

def validate_image_count
  if self.items.images.size < 3
    errors.add(:images, "Need at least 3 images")
  end
end

Надеюсь, это поможет, удачи и удачного кодирования.

2 голосов
/ 08 сентября 2013

Другой вариант - использовать этот маленький трюк с проверкой length. Хотя большинство примеров показывают, что он используется с текстом, он также проверяет длину ассоциаций:

class Sale < ActiveRecord::Base
   has_many :items,  dependent: :destroy
   has_many :images, through: :items

   validates :items,  length: { minimum: 1, too_short: "%{count} item minimum" }
   validates :images, length: { minimum: 3, too_short: "%{count} image minimum" }
end

Вам просто нужно предоставить собственное сообщение, так как в сообщении по умолчанию упоминается количество символов.

...