有没有办法如何执行保存在数据库中的验证指令?
请参阅,我没有数据库列的静态定义属性,但定义为行类型。
Examle:
拥有群组和属性。每个小组都应该有不同的属性。
Groups: id, name
Attributes: id, name
GroupAttributes: id, group_id, attribute_id, validation(serialize hash as string, same as rails validations)
Articles: id, group_id, attribute_id, value
根据定义的组动态创建表单。对于相同的属性,组1可能对属性1具有不同于组1的验证。
但是大问题是验证。我无法在Model中隐式定义它。因为我不知道哪些属性想要使用。
我有一个想法评估保存在数据库中的字符串。但是当注入代码时(这是非常不受欢迎的),它是至关重要的。
你知道如何解决这个问题吗?
原则是:我会写关于CMS,它可能会更清楚。
CMS有文章/帖子,帖子属于集团(类别)。
文章应该有很多属性(保存在属性数据库表中),如标题,内容,摘录,缩略图等。但是这些属性并不是每篇文章都有。
这是因为Article属于Group。例如:新闻,帖子,财产,评论等。
还有我想要的东西。当我写一些评论时,并不是必须为所有组添加所有字段(属性),只需要那些需要。
所以我的想法是,将属性定义为“行类型”而不是“列类型”更容易。任何时候我都可以添加新的,删除旧的任何组。任何组都可能有数十个属性(和不同的属性)。
在必要加入所有模型之后,我想为每个属性定义验证(顶部的“验证”列),并且仅用于与组(GroupAttributes)相关联的这些属性。 将这些属性验证提供给模型,就像标准的Rails“验证”一样。没有复杂的“if”和“unless”条件语句。
希望比第一个更详细。
答案 0 :(得分:1)
您可以尝试制作自定义验证器,然后为组循环属性并在文章上评估其验证参数。但是你需要一个适当的哈希来进行rails验证。
GroupAttributes.first.validation => {:presence => true,
:length => {:minimum => 3, :maximum => 254},
:uniqueness => true}
#app/models/article.rb
class Article << ActiveRecord::Base
vlidates_with ArticleValidator
end
#lib/article_validator.rb
class ArticleValidator << ActiveModel::Validator
def validate(record)
record.group.group_attributes.each do |group_attribute|
record.validates group_attribute.attribute.name, group_attribute.validation
end
end
end
我不确定这是否有效,但希望它会有所帮助。
更新:我错了它没有用,因为验证是ActiveModel方法而不是像我想的那样ActiveRecord。正确的答案是你必须添加before_validation回调,然后设置正确的验证器。
class Article << ActiveRecord::Base
before_validation :set_validators
validates :group_id, :presence => true
privat
def set_validators
self.group.group_attributes.each do |group_attribute|
Article.validates group_attribute.attribute.name, group_attribute.validation
end
end
end