Рельсы принимает вложенные атрибуты, счетчик проверки
У меня есть три модели. Продажи, товары и изображения. Я хотел бы проверить, что при создании продажи есть по крайней мере три фотографии на продажу и один или несколько предметов. Каков был бы наилучший способ достичь этого?
Модель Продаж:
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 ответа:
Создание пользовательских методов для проверки
В вашей модели продаж добавьте что-то вроде этого:
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
Надеюсь, что это поможет вообще, удачи и счастливого кодирования.
Другой вариант-использовать этот маленький трюк с
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
Вам просто нужно предоставить свое собственное сообщение, поскольку в сообщении по умолчанию упоминается количество символов.