2012-03-29 4 views
4

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

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

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 

ответ

6

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

В модели продаж добавить someth например:

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

Идеально назвать эти методы validate_item_count и validate_image_count, потому что это уточняет ваше намерение и что методы добавляют ошибки. – joelparkerhenderson

+0

Хорошая точка, спасибо за добавление. – digicazter

2

Другой вариант использует этот небольшой трюк с валидацией 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 

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