动态生成ORM类

时间:2011-06-07 04:22:32

标签: ruby orm metaprogramming sinatra

我正在开发一个使用Datamapper ORM的基于Sinatra的项目。我希望能够在外部YAML文件中定义DM验证的标准,以便系统中经验不足的用户可以轻松调整设置。我有这个作为一个概念验证工作得很好,但我怀疑可能有一个更容易或最少的处理器密集的方法来解决这个问题。

现在,该脚本加载YAML文件并使用一系列eval语句生成DM类(我知道这已经让我处于困境)。问题是这个过程必须在每个请求中发生。我的好主意是检查YAML的更改,重新生成类并在检测到更改时导出到静态源,如果没有检测到更改,则包括静态文件。

这比我预期的要困难,因为将代码块导出到字符串以进行序列化并不像我预期的那样简单。

这是荒谬的吗?我是以完全错误的方式接近这个吗?

我是Ruby和ORM世界的新手,所以请原谅我的无知。

谢谢!

2 个答案:

答案 0 :(得分:1)

  

外部YAML文件中的DM验证,以便系统中经验不足的用户可以轻松调整设置

用于DSL的DSL。没看过你的YAML我还想知道它真的能比DM Validations容易多少?

require 'dm-validations'
class User
  include DataMapper::Resource

  property :name, String
  # Manual validation
  validates_length_of :name, :max => 42

  # Auto-validation 
  property :bio, Text, :length => 100..500
end

我会向经验较少的用户提供一些相关的验证示例,而不是基于dm-validations documentation提供简短的指南。

答案 1 :(得分:0)

将所有内容放在YAML中似乎有点疯狂,因为这比在Ruby中编写验证更容易。你可以做的是在Ruby中制作一个DSL,使得定义验证变得更加容易,然后将其暴露给你的用户而不是整个类。