所以我从我的数据库中抽取了很多图表/分析,需要非平凡的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类并将一些方法修补到它们上面。这是更多的OO,但感觉有点矫枉过正 - 我是否应该考虑这样做,或者我应该在每种方法中重复Arel?
答案 0 :(得分:1)
我通常会使用范围。这是一个人为的例子:
scope :filtered_by_org, ->(org_id) {where(lists_table[:org_id].eq(org_id))}
loads_of_other_arel.filtered_by_org(@org.id)
阅读documentation将有助于推动这一点。