如何在嵌套属性中使用条件 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_id
和 answer_id
字段。如果 Question 模型中的 isrequire
字段等于 true,我想过滤 answer_field
?我将如何做到这一点?如何在模型中访问 has_one 关联的属性?
这不是答案,这是我解决问题的方法
检查时间:
validates_presence_of :answer_field, :if => lambda {isrequired == true}, :message => "This is required field"
你有什么变量可以用pry-rails
gem。像这样:
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.question
或 record.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
(抱歉,它被锁定在私有 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
我有模型问题、答案和答案详细信息。
答案:
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_id
和 answer_id
字段。如果 Question 模型中的 isrequire
字段等于 true,我想过滤 answer_field
?我将如何做到这一点?如何在模型中访问 has_one 关联的属性?
这不是答案,这是我解决问题的方法
检查时间:
validates_presence_of :answer_field, :if => lambda {isrequired == true}, :message => "This is required field"
你有什么变量可以用pry-rails
gem。像这样:
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.question
或 record.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
(抱歉,它被锁定在私有 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