所以我从我的数据库中绘制了很多图表/分析,这些图表/分析需要非平凡的 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?