创建可重用的Arel块

时间:2013-06-14 15:11:44

标签: ruby-on-rails ruby arel

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

1 个答案:

答案 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将有助于推动这一点。