1

所以我从我的数据库中绘制了很多图表/分析,这些图表/分析需要非平凡的 SQL 来获取他们的数据。我通过编写大量原始 SQL 完成了 v1,现在我想将其转换为 Arel。

很多查询都有大块的重复代码。举个简单的例子,我经常想获取Lists给定Org. 在 Arel 中,这是:

loads_of_other_arel.where(lists_table[:org_id].eq(@org.id))

我想将重复分解为lists_table[:org_id].eq(@org.id)

loads_of_other_arel.filter_lists_by_org

这可以通过以下方式完成:

def filter_lists_by_org arel
  arel.where(lists_table[:org_id].eq(@org.id))
end

然后调用filter_lists_by_org(loads_of_other_arel),但这似乎非常程序化,而不是我们作为优秀的 OO 程序员应该做的事情。所以看起来我将不得不打开一些现有的 Arel 类并在它们上猴子修补一些方法。这更像是面向对象,但感觉有点矫枉过正——我是否应该考虑这样做,还是应该在每种方法中重复 Arel?

4

1 回答 1

1

我通常为此使用范围。这是一个人为的例子:

scope :filtered_by_org, ->(org_id) {where(lists_table[:org_id].eq(org_id))}

loads_of_other_arel.filtered_by_org(@org.id)

阅读文档将有助于理解这一点。

于 2013-06-14T15:20:23.713 回答