Rails 3.1数据库中定义的验证

时间:2011-11-02 22:05:09

标签: ruby-on-rails ruby-on-rails-3 validation dynamic-data

有没有办法如何执行保存在数据库中的验证指令?

请参阅,我没有数据库列的静态定义属性,但定义为行类型。

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”条件语句。

希望比第一个更详细。

1 个答案:

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