2015-09-29 1 views
2

У меня есть модель Вопрос, ответ и ответ.Как validate_presence_of с условием вложенных атрибутов?

Ответ:

class Answer < ActiveRecord::Base 
    has_many :answer_details, :dependent => :destroy 
    accepts_nested_attributes_for :answer_details, :allow_destroy => true 
    validates_associated :answer_details 
end 

AnswerDetail:

class AnswerDetail < ActiveRecord::Base 
    belongs_to :answer 
    belongs_to :question 
    validates_presence_of :answer_field, :if => lambda {isrequired == true}, :message => "This is required field" 
end 

Поле isrequired от модели вопроса.

Вопрос:

class Question < ActiveRecord::Base 
    has_one :answer_detail 
end 

Модель AnswerDetal имеет поле question_id и answer_id на нем. Я хочу, чтобы фильтр answer_field, если поле isrequire из модели вопроса равно true? Как я это сделаю? Как получить доступ к атрибуту ассоциации has_one внутри модели?

ответ

1

Я сделал это раньше, хотя я не получил код под рукой прямо сейчас:


Уплотненный

Из того, что я помню, вы можете поставить проверку в вложенная модель:

#app/models/question.rb 
class Question < ActiveRecord::Base 
    validates :answer_field, presence: true, if: lambda {isrequired == true} 
end 

Я настоятельно рекомендую использовать новый синтаксис validates

-

inverse_of

Я уверен, что я должен был использовать inverse_of где-то в коде я имел (он заблокирован в частном GitHub репо пардон).

inverse_of в основном включает связанную модель в вашей текущей модели. Так же, как, как вы нашли эффективность self.question.isrequired:

#app/models/answer_detail.rb 
class AnswerDetail < ActiveRecord::Base 
    belongs_to :question, inverse_of: :answer_detail 
    validates :answer_field, presence: true, if: lambda { question.isrequired == true } 
end 

#app/models/question.rb 
class Question < ActiveRecord::Base 
    has_one :answer_detail, inverse_of: :question 
end 

Однако, good news for you:

enter image description here

+0

Я немного запутался, чтобы ваш ответ? Мне нужно поставить 'validates: answer_field, presence: true, if: lambda {isrequired == true}' на модели вопроса? Зачем? –

1

Это не ответ, это то, как я бы устранить

Проверить в:

validates_presence_of :answer_field, :if => lambda {isrequired == true}, :message => "This is required field" 

Какие переменные вы имеете в наличии, вы можете сделать это с pry-rails камень. Как это:

validates_presence_of :answer_field, :if => lambda {binding.pry; isrequired == true}, :message => "This is required field" 

При попытке сохранить вопрос вы получите интерактивную консоль (в окне терминала сервера), где вы можете распечатать значения как self или сделать это:

validates_presence_of :answer_field, :if => lambda {|record| binding.pry; isrequired == true}, :message => "This is required field" 

И печать record ,

Затем вы можете найти, где Question хранится: self.question или record.question.

0

Я пробовал использовать self.question.isrequired и работает. Но, возможно, у вас есть другое приятное предложение сделать проверку ошибок. Спасибо.