我有两个ActiveRecord关系,称他们为rel1
和rel2
。他们每个人都会添加各种不同的joins
和where
条款。
我想对每个条款应用一些相同的条款序列,我不想重复自己。
这样做的一种方法是创建一个函数:
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
作为单独的函数。我会以某种方式将joins
和where
放在func
的本地内容中,并将该内容应用于rel1
和rel2
。
这可能吗?如果没有,这里的方法是什么?
答案 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