我有两个型号CharacterSheet
和Sheet
,它们都具有properties
列。Sheet
的properties
列用于存储属性名称的键值对及其验证(它们在惯用上正确正确的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