2016-03-04 4 views
0

У меня есть две модели:Rails ActiveRecord запроса

class Invoice < ActiveRecord::Base 
    has_many :payments_received 
end 

class PaymentReceived < ActiveRecord::Base 
    belongs_to :invoice 
end 

Мне нужно написать запрос, чтобы найти счета-фактуры, которые имеют либо нет payments_received или сумма payments_received.amount не меньше, чем invoice.amount

я могу найти счета-фактуры с не payments_received:

@invoices = Invoice.includes(:payments_received).where(:payments_received => { :invoice_id => nil }) 

Но мне нужно найти счета-фактуры, где сумма всех связанных payments_received меньше invoice.amo ЕНТ.

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

def self.unpaid 
    unpaid_invoices = [] 
    total_payments = 0 
    invoices = Invoice.all 
    invoices.each do |invoice| 
    if invoice.payments_received.empty? 
     unpaid_invoices << invoice 
    else 
     invoice.payments_received.each do |payment_received| 
     total_payments += payment_received.amount 
     end 
     if total_payments < invoice.amount 
     unpaid_invoices << invoice 
     end 
    end 
    end 
    unpaid_invoices 
end 

ответ

0

вы можете цепи, где пункты:

@invoices = Invoice.includes(:payments_received).where(:payments_received => { :invoice_id => nil }).where("payments_received.amount > ?", amount) 

попробовать написать их как индивидуально, так и после того, как вы получаете то, что вы хотите вернуть цепочку запрос вместе.

0

Надеюсь, вы хотите что-то подобное.

@invoices.collect do |invoice| 
    invoice.payments_received.pluck(:amount).sum < invoice.amount ? invoice : next 
end.compact 
+0

Мне нравится этот код @Ahsan ЭЛЛАХИ, но я искал способ, чтобы достичь этого, не вытягивая все счета-фактур из базы данных и перебора каждого из них. – brainburn

Смежные вопросы