如何在嵌套属性中使用条件 validate_presence_of?

How to validate_presence_of with condition in a nested attributes?

我有模型问题、答案和答案详细信息。

答案:

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

答案详情:

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_idanswer_id 字段。如果 Question 模型中的 isrequire 字段等于 true,我想过滤 answer_field?我将如何做到这一点?如何在模型中访问 has_one 关联的属性?

这不是答案,这是我解决问题的方法

检查时间:

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

你有什么变量可以用pry-railsgem。像这样:

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

当尝试保存问题时,您将获得一个交互式控制台(在服务器终端 window 中),您可以在其中打印值 self 或执行此操作:

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

并打印record.

然后您可以尝试查找 Question 的存储位置:self.questionrecord.question

我尝试使用 self.question.isrequired,它正在运行。但也许您还有其他不错的建议来进行错误验证。谢谢。

我以前做过,虽然我现在手边没有代码:


嵌套

根据我的记忆,您实际上可以将验证放在嵌套模型中:

#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: