2016-08-06 9 views
0

Ich habe eine Record-Klasse und Pay-Period-Klasse, jeweils mit einer start_time und end_time.Eager Load ohne eine formale ActiveRecord Association

ich eine Reihe von Aufzeichnungen erregenden

Record.where(start_time: s..e) 

mit betreibe ich in eine N + Abfrage Ausgabe 1, weil, wenn ich Schleife durch diese Aufzeichnungen, habe ich eine Abfrage für das Abrechnungsperiode ist. Zahlungszeiträume können sich nicht überschneiden, daher kann ein Datensatz eine oder keine Zahlungsperiode haben; Sie sind jedoch nicht mit Record mit einer codierten Active Record Association verknüpft. Meine Anfrage für die Abrechnungsperiode zu finden:

PayPeriod.where(%q{ (start_time, end_time) OVERLAPS (?, ?) }, self.start_time, self.end_time).first 

Die Klassen:

class Record < ActiveRecord::Base 
    ... 
    validates :start_time, presence: true 
    validates :end_time, presence: true 
    ... 
end  


class PayPeriod < ActiveRecord::Base 
    ... 
    validates :start_time, presence: true 
    validates :end_time, presence: true 
    ... 
end 

Ich weiß, ich brauche die PayPeriods mit den Aufzeichnungen vorzuladen. Ich kämpfe nur wirklich, wie es geht.

+0

was ist die Assoziation zwischen den paypriods und Aufzeichnungen –

Antwort

0

Sie können immer einfaches SQL als Argument für die Methode where verwenden. Beachten Sie, dass die Tabellennamen in der Regel mehrere sind.

Ich denke, dass ein Record viele PayPeriods hat dann könnte es wie folgt aussehen:

Record.where(start_time: (start_time..end_time)) 
     .joins(pay_periods) 
     .where('(pay_periods.start_time, pay_periods.end_time) OVERLAPS (records.start_time, records.end_time)')