将相同的arel子句链应用于不同的关系

时间:2015-01-08 03:52:05

标签: sql ruby-on-rails activerecord arel

我有两个ActiveRecord关系,称他们为rel1rel2。他们每个人都会添加各种不同的joinswhere条款。

我想对每个条款应用一些相同的条款序列,我不想重复自己。

这样做的一种方法是创建一个函数:

def without_orders rel
   rel.joins("LEFT JOIN orders ON customers.id = orders.customer_id").where("customers.id IS NULL")
end

rel1 = Customer
rel2 = Customer

# add a bunch of clauses to rel1
# add some other clauses to rel2

rel1 = without_orders(rel1)
rel2 = without_orders(rel2)

理想情况下,我不会将without_orders作为单独的函数。我会以某种方式将joinswhere放在func的本地内容中,并将该内容应用于rel1rel2

这可能吗?如果没有,这里的方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以将它们全部放入各个范围:

scope :without_orders, -> { joins("LEFT JOIN orders ON customers.id = orders.customer_id").where(customers: { id: nil }) }

然后你可以将它与其他范围链接起来。

Customer.without_orders.where(foo: bar)

答案 1 :(得分:1)

这是积极支持问题的理想选择

# app/models/concerns/customer_related.rb

module CustomerRelated

  extend ActiveSupport::Concern

  module ClassMethods

    def whithout_orders
      joins("LEFT JOIN orders ON customers.id = orders.customer_id").where("customers.id IS NULL")
    end

  end

end

然后在你的模型中加入它:

include CustomerRelated

然后你可以像任何包含关注点的模型上的范围一样使用它

Rel1.without_orders

Rel2.without_orders