将Ruby on Rails验证规则实现在数据库中,而不是在模型文件中硬编码实现?

3

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

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

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

有没有办法把这条规则放到一个规则表中,查询数据库获取规则,然后在模型中根据规则进行验证呢?例如,在模型文件中方便地编写此类查询的方法?
class User < ActiveRecord::Base
  Rule.first.validation
end

Rule.first.validation的值将是"validates :name, presence: true"。

谢谢。


我可以想到做这件事的方法,但我不明白为什么你会想要这样做。你能详细说明一下你使用这个的场景吗?如果有其他方式可以满足你的需求,那么调查一下可能是值得的。 - Reck
2个回答

1

可以通过使用validateseval来实现,但是非常有限且存在风险。此外,您将验证从可测试和部署为工作的位置移动到数据库中,这将受到系统管理员的任意干预。我强烈建议不要以这种方式违反惯例。从长远来看,您最好经常推出更新(并进行相应的测试)。


谢谢回复。我得看看eval,同时也要重新考虑设计。 - MichaelHajuddah

0

请查看这个宝石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表,以便动态添加/删除验证。该表的结构非常简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接