2016-04-11 5 views
1

Ich versuche, eine Unterabfrage zu verwenden, um den letzten Status einiger Datensätze auszuwählen. Ich habe die folgende Abfrage in SQL, die ich in Rails mit dem squeel Juwel neu erstellen möchten:Squeel-Unterabfrage

SELECT * FROM 
changerequests c JOIN 
    (SELECT changerequest_id, max(created_at) max_created_at from 
    changerequest_statuses 
    GROUP BY changerequest_id) as max_status 
ON c.id = max_status.changerequest_id 
JOIN changerequest_statuses cs 
ON cs.changerequest_id = c.id and max_status.max_created_at = cs.created_at 
JOIN dim_change_statuses dcs 
ON dcs.id = cs.dim_change_status_id 

Im Anschluss an die Führung hier: https://github.com/activerecord-hackery/squeel#joins Ich habe die folgende Unterabfrage:

subquery = ChangerequestStatus.group(:changerequest_id).select { [changerequest_id, max(created_at).as(max_date)] } 

, das funktioniert. Verbinden sie jedoch zum Change Modell bis ich ein NoMethodError: undefined method 'changerequest_id' for #<Hash> Fehler

Changerequest.joins{[changerequest_statuses, subquery.as('max_status').on { id == max_status.changerequest_id}]} 

Diese wie identische Syntax mir aussieht. Was gibt?

Antwort

0

Ich fand, dass diese Bereiche zu schaffen, das Problem gelöst:

In ChangerequestStatus.rb:

scope :max_id, -> {select('MAX(id) as max_id').group(:changerequest_id).map(&:max_id)} 

In Changerequest.rb:

scope :max_condition, -> {where('changerequest_statuses.id IN (?)', ChangerequestStatus.max_id)} 

Es ist nur eine Teillösung, da es nur arbeitet mit IDs, nicht mit Daten, und nimmt an, dass später datierte Datensätze immer höhere IDs haben werden, was nicht immer der Fall sein wird.