2016-03-22 8 views
3

Ich habe Projekte und Zuschüsse, die durch eine Übereinstimmung verbunden sind. Die Förderung hat ein Ablaufdatum. Ich möchte die Übereinstimmungen eines Projekts nach dem Ablaufdatum der Gewährungen sortieren.Wie kombiniere ich wo und Bestellung für SQL-Abfrage

Das bin ich die Spiele Verfallsdatum erhalten basiert auf:

def self.expires_date_between(from, to) 
    Match.where(:grant_id => Grant.where("expires_at >= ? and expires_at <= ?", from, to)) 
end 

Und dies zeigt die auf einem bestimmten Datumsbereich basierend Streichhölzer.

def current_matches 
    range = user.current_period_range 
    matches.expires_date_between(range[0], range[1]) 
end 

Dies funktioniert gut, die Zuschüsse auf einen bestimmten Zeitraum anhand zu zeigen, aber die Zuschüsse werden nicht geschaltet, um auf dem neuesten Stand (expires_at). Es scheint, dass Grants nach dem Erstellungsdatum sortiert werden. Wie kann ich meine Abfrage so ändern, dass die Zuweisungen in der Reihenfolge ihres Ablaufdatums aufgelistet werden?

Ich habe versucht:

def self.expires_date_between(from, to) 
    Match.where(:grant_id => Grant.where("expires_at >= ? and expires_at <= ?", from, to).order('expires_at asc')) 
end 

Dieser keinen Fehler werfen, aber es ist auch nicht die Reihenfolge der Zuschüsse ändern. Irgendwelche Ideen?

+0

Sie den 'BETWEEN' Betreiber nicht vergessen, die Sie mit' wo (expires_at verwenden können: von .. bis) '. – tadman

+0

danke für den Tipp, das macht meinen Code viel sauberer! – railsie

Antwort

3

Angenommen, Sie haben Ihre Assoziationen in Ihren Modellen definiert ist, sollte diese Arbeit (aber wurde nicht getestet):

Match 
    .joins(:grant) 
    .merge(Grant.where("expires_at >= ? and expires_at <= ?", from, to)) 
    .order('expires_at asc') 
+0

Das hat perfekt funktioniert. Ich fügte auch den Vorschlag von @tadman hinzu und endete mit 'Match.joins (: grant) .merge (Grant.where (" expires_at BETWEEN? AND? ", Von, bis)). Order ('expires_at asc')'. – railsie

Verwandte Themen