如何在我使用其他模型对该字段进行类型转换的文本字段中编写自定义rails验证?

时间:2016-01-08 05:36:21

标签: ruby-on-rails postgresql validation

我的应用程序中有一系列硬编码问题,我通过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的问题匹配?

1 个答案:

答案 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