使用Rails内置验证器通过动态选项验证哈希



我有两个型号CharacterSheetSheet,它们都具有properties列。Sheetproperties列用于存储属性名称的键值对及其验证(它们在惯用上正确正确的Ruby validates语法(。

Sheet.create!(name: 'A Test Sheet',
              properties: {
                prop1: { numericality: { only_integer: true }, length: { maximum: 3 } },
                prop2: { numericality: { only_integer: true }, length: { minimum: 1 } },
                prop3: { numericality: { only_integer: true } }
              })

CharacterSheet存储属性名称的键值对及其实际值,通过适当的Sheet键值对验证。

CharacterSheet.create(sheet_id: 1,
                      name: 'A Test CharacterSheet',
                      properties: {
                        prop1: 123,
                        prop2: 234,
                        prop3: 345
                    })

理想情况下,我想使用Sheet.properties中存储的验证要求使用Rails的内置验证方法,因此我不必自己重写所有这些验证。但是,我找不到适当的方法。 self.validates似乎没有达到我的目的>

所以我看到的第一个问题是,您还需要转换它的含义,数值以及如何获取该属性,而Only_integer以及这意味着什么。我建议您使用

之类的东西
prop_name: { type_of_validation: 'regexp', validator: 'Regex-representation' }
prop_name2: { type_of_validation: 'type', validator: 'Hash' }

正则表示需要双排放。

因为您可以做

 loaded_sheet = Sheet.find(csheet.sheet_id).properties.as_json.with_indifferent_access
    csheet.properties.as_json.with_indifferent_access.each do |k,v|
      if loaded_sheet[k.to_sym][:type_of_validation] == 'regexp'
        regex = Regexp.new loaded_sheet[k.to_sym][:validator]
        return false unless v =~ regex
      elsif loaded_sheet[k.to_sym[:type_of_validation] == 'type'
        return false unless v.is_a?(loaded_sheet[k.to_sym][:validator].constantize)
      end
    end

相关内容

  • 没有找到相关文章

最新更新