2013-04-25 2 views
2

У меня есть три модели model1, model12 и mode2. Модель1 имеет много моделей модели 2 модели 12.Rails validates_presence_of проверяет сохраненную запись вместо отредактированной записи

Я должен проверять наличие модели2 через модель12.

Когда я пытаюсь сохранить отредактированную запись для рельсов model1, вы сохраняете запись, у которой нет модели 2. Проверка только завершается с ошибкой, когда уже существующая запись БД в модели 1 не содержит данных модели2.

class model1 < ActiveRecord::Base 
    has_many :model12, :dependent => :destroy, :include => [:model] 
    has_many :model2, :through => :model12, :uniq => true 

    validates_presence_of :model12, :message => "must be present" 

Я попытался

validates_presence_of :model2, :message => "must be present" 

Это тоже не работает.

Я полагаю, что в моем случае как-то рельсы проверяют сохраненную запись вместо несохраненной записи. Вот почему, когда уже сохраненная запись имеет модель 2, а несохраненная запись не имеет проверки модели2, она не терпит неудачу. Но это не удается, если сохраненная запись не имеет модели 2, а несохраненная запись также не имеет model2.

Пожалуйста, дайте мне знать, если мой вопрос не ясен.

+0

Я думаю, вы должны добавить пользовательскую проверку для этого. – 2013-04-25 08:13:57

+0

@SanthoshK Я делал это как validate do | model1 | model1.error («должен быть выбран»), если model1.model12s.blank? end Но здесь также такая же проблема, что «если model1.model12s» возвращает старое значение, которое находится в БД. – Nitesh

+1

Это работает для меня. validate: address_present def address_present self.errors.add (: name, "can not be blank") if self.addresses.size == 0 end – 2013-04-25 09:04:46

ответ

1

Я нашел решение для своей проблемы.

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

так что рельсы находили некоторые модели2с, поэтому никаких ошибок проверки.

class model1 < ActiveRecord::Base 

    has_many :model12, :dependent => :destroy, :include => [:model] 
    has_many :model2, :through => :model12, :uniq => true 

    accepts_nested_attributes_for :model2, 
    :allow_destroy => true, 
    :reject_if => proc {|m| m.blank? } 

    validate :must_have_one_model2 

    def must_have_one_model2 
    errors.add(:model2s, 'must have one model2') if model12s_count_valid? 
    end 

    def model12s_count_valid? 
    model12s.reject(&:marked_for_destruction?).count >= 1 
    end 
end 

Благодаря посту ля холма validation presence with nested models

 Смежные вопросы

  • Нет связанных вопросов^_^