3

自从我使用纯 SQL(无 ORM)从 PHP 切换到 Rails/AR 以来,一直在寻找类似第 4 点所述的内容 。

简而言之,如果您.select()在执行聚合、计算或附加操作的查询上添加一个IF(),那么 AR 可确保您返回的所有记录都具有正确填充AS alias的额外(临时)属性。alias(临时作为其他查询的结果将没有该属性)

正如博客文章所指出的,这意味着您可以使用单个查询进行多次计数。您还可以通过从相关表中提取列或在列之间进行计算并将结果放在结果记录的临时/一次性属性中来对数据进行非规范化。

这看起来很棒,所以我的问题是为什么我不经常看到这样做以及是否有很好的风格理由来避免它。

我的一位同事担心它可能会造成混淆,因为其他人搜索def alias永远不会找到它。我可以看到对可能广泛传递的记录执行此操作是一个坏主意,以便.alias()从创建它的查询中完全删除对的调用,但是对于报告或简单的显示/索引操作似乎它会非常安全和有用。

这也只是“如果我们定期执行此操作就不会令人困惑”的情况,即(def|AS) alias当人们不知道某物来自何处时,他们会很快学会搜索。

我想更广泛地说,我从来不明白为什么你不会在查询中做这样的简单计算,如果可以的话——最好让它们在已经迭代集合的 C 代码中运行,而不是在 Ruby 中运行的第二个循环中运行,后者如果您不执行上述操作,则通常是必需的。在不涉及 PL/SQL 或存储过程的情况下,为什么不将尽可能多的工作推入高度优化的 DB 层呢?特别是不是业务逻辑的简单东西。

我很想知道是否有充分的理由这不是好的风格或可能出错的例子,或者是否有其他人将其用作标准习语并且不会对此感到惊讶。

4

0 回答 0