2015-01-08 2 views
0

У меня есть два отношения ActiveRecord, назовите их rel1 и rel2. Каждый из них получает разные статьи joins и where.Примените ту же цепочку предложений isl к различным отношениям

Я хочу применить к каждой из них определенную идентичную последовательность предложений, и я не хочу повторять себя.

Один из способов сделать это было бы сделать функцию:

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.

Возможно ли это? Если нет, то какой здесь подход?

ответ

1

Вы могли бы сделать их все в inidivual прицелов:

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

И тогда вы можете приковать его с другими областями.

Customer.without_orders.where(foo: bar) 
1

Это является хорошим кандидатом для ActiveSupport концерна

# 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 
+0

Спасибо. Существует ли преимущество этого подхода в отношении одного из вариантов evanbikes? –

+0

Это стандартный способ добавления похожих функций для всех моделей. – Swards

+0

Я воспользовался вашим ответом из-за этого преимущества, но отметил другой как принятый, потому что он требует меньше кода и сохраняет логику локальной модели, что кажется более естественным. Сфера применения может иногда нуждаться в совместном использовании между моделями, но, скорее всего, они более распространены, чем нет. –