3

我有一个应用程序,我想在数据库中存储所有数据库验证规则,因为管理员需要能够从 GUI 更改验证规则。此外,规则预计会经常更改,所以我的要求是规则需要在数据库中。

为简单起见,假设我有一个用户模型,并且“名称”需要存在的验证规则。通常,你会说:

class User < ActiveRecord::Base
  validates :name, presence: true
end

有没有办法将此规则粘贴到规则表中,查询数据库中的规则,然后让模型根据规则表中的规则进行验证?即像这样在模型文件中编写查询的简单方法?

class User < ActiveRecord::Base
  Rule.first.validation
end

Rule.first.validation 的值将是“验证:名称,存在:真”。

谢谢。

4

2 回答 2

1

可以这样做(比如使用validatesand eval),但非常有限且有风险。另外,您正在将验证从可测试和部署为工作的地方转移到受系统管理员心血来潮影响的数据库。我强烈建议不要以这种方式违反惯例。从长远来看,您最好推出频繁的更新(带有相应的测试)。

于 2013-04-07T21:33:47.143 回答
0

查看此 gem https://github.com/vprokopchuk256/mv-core。它允许您在数据库级别定义验证。像这样的东西:

def change
  create_table :posts do |t|
    t.string :title, length: [1..30]
  end
end

结果,将创建触发器或检查验证。这取决于数据库。

在内部,所有验证都存储在特殊的 :migration_validators 表中。:table_name、:column_name、:validation_type 和验证选项存储在那里。

并且有可能将该表中的验证升级到您的模型:

class Post < ActiveRecord::Base 
  enforce_migration_validations
end

所以 - 您可以更新 :migration_validations 表以动态添加/删除验证。该表的结构非常简单。

于 2015-01-28T20:32:11.413 回答