2016-03-22 14 views
3

Bir eşleme aracılığıyla bağlı projeler ve hibeler var. Hibe son kullanma tarihi vardır. Bir projenin maçlarını hibe son kullanma tarihine göre sıralamak istiyorum.SQL sorgusu için nerede ve sipariş birleştirmek için nasıl

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

Ve bu belli bir tarih aralığına göre maçları gösterilmektedir:

Bu bana son kullanma tarihine göre eşleşmeleri var olsun.

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

Bu belirli bir zaman diliminde dayalı hibe göstermek için harika çalışıyor ama hibe tarihi (expires_at) sırasına göre gösterilmiyor. Ödeneklerin, oluşturuldukları tarihe göre sıralandığı görülmektedir. Sorgularımın son kullanma tarihi sırasına göre listelenmesini nasıl sağlayabilirim?

Denedim:

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 

Bu hata atmak değil ama aynı zamanda hibe sırasını değiştirmez. Herhangi bir fikir?

+0

Eğer 'nereye (expires_at ile kullanabileceğiniz' BETWEEN' operatörü unutmayın: .. 'den)' ye. – tadman

+0

İpucu için teşekkürler, bu benim kodumu daha temiz hale getirir! – railsie

cevap

3

Eğer bu çalışması gerekir Modellerinizde İlişkilerinizi tanımladığınız varsayarsak (ancak test edilmemiştir):

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

Bu mükemmel bir şekilde çalıştı. Ben de öneriyi @tadman'dan ekledim ve Match.joins (: grant) .merge (Grant.where ("expires_at BETWEEN? AND?"), Ile,) 'den (order)' ('expires_at asc') 'ile bitti. – railsie