我的应用程序中有一系列硬编码问题,我通过YAML加载:
class Question < ActiveRecord::Base
validates :next_question_id_yes, :question_text, :answer_type, presence: true
belongs_to :sale_qualifier
if Question.first.blank?
File.open("#{Rails.root}/config/initializers/questions.yml", 'r') do |file|
YAML::load(file).each do |record|
Question.create(record)
end
end
end
end
其中一个问题的一个例子如下:
- id: 1
question_text: Does this company need to buy your products or services?
answer_type: Boolean
next_question_id_yes: 2
next_question_id_no: 4
这是一个状态机 - 所以我打算使用SaleQualifier模型将硬编码问题与答案联系起来,answer_type
字段将用于定义答案的自定义验证在我保存它之前的模型:
class SaleQualifier < ActiveRecord::Base
has_many :questions
has_many :answers
end
Answer.rb:
class Answer < ActiveRecord::Base
validates :answer_text, presence: true
belongs_to :sale_qualifier
end
目前我可以执行的唯一验证是检查答案是否已放入answer_text
字段(位于Postgres数据库中的类型为&#34; text&#34;)。 / p>
我想要做的是使用SaleQualifier控制器创建一个带有正确问题的新SaleQualifier(为了简单起见,我们假设这是一个问题),并构建一个新的Answer实例。我知道我可以使用Question模型中的answer_type字段来确定我显示的HTML(例如文本数据类型的Textarea,是/否答案的单选按钮等),但是我如何使用answer_type
字段我的问题模型强制Answer模型运行自定义验证,以确保我的用户为answer_text
字段输入的任何数据与answer_type
的问题匹配?
答案 0 :(得分:1)
由于answer_text是数据库中的文本,如何在此处进行格式验证?
TYPE_REGEX = {
'Boolean' => /^(true|false)$/,
'Integer' => /^[\+-]?\d+$/,
'...' => '...'
}
validate :check_answer_text_type
def check_answer_text_type
unless answer_text.match(TYPE_REGEX[answer_type])
self.errors.add(:answer_type, 'invalid format')
end
end