我是 DataMapper 维护者,我认为对于复杂的报告,您应该使用 SQL。
虽然我确实认为有一天我们将拥有一个提供 SQL 的强大功能和简洁性的 DSL,但到目前为止,我所看到的一切都需要您编写比 SQL 更多的 Ruby 代码来处理复杂的查询。我宁愿维护一个 5 行 SQL 查询而不是 10-15 行 Ruby 代码来描述相同的复杂操作。
请注意我说的是复杂的。如果你有一些简单的东西,请使用 ORM 的内置查找器。但是,我相信有一条线可以让 SQL 变得更简单。现在,大多数应用程序不仅仅是报告。你可能有很多 CRUD 类型的操作,ORM 非常适合这些操作,并且比手动完成这些操作要好得多。
ORM 通常会提供的一件事是对您的应用程序逻辑进行某种组织。您可以根据同一文件中的每个模型对代码进行分组。我通常会在那里放置复杂的 SQL 查询,而不是将其嵌入控制器中,例如:
class User
include DataMapper::Resource
property :id, Serial
property :name, String, :length => 1..100, :required => true
property :age, Integer, :min => 1, :max => 130
def self.some_complex_query
repository.adapter.select <<-SQL
SELECT ...
FROM ...
WHERE ...
... more complex stuff here ...
SQL
end
end
然后我可以使用User.some_complex_query
. 如果您想进一步清理此代码,还可以将 SQL 查询推送到视图中。
编辑:上面句子中的“视图”是指 RDBMS 视图,而不是 MVC 上下文中的视图。只是想清除任何潜在的混乱。