2016-04-11 3 views
1

Я пытаюсь использовать подзапрос, чтобы выбрать последний статус некоторых записей. У меня есть следующий запрос в SQL, который я хотел бы, чтобы воссоздать в Rails, используя squeel перл:Squeel subquery

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 

следуя руководству здесь: https://github.com/activerecord-hackery/squeel#joins У меня есть следующий подзапрос:

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

Это работает. Однако присоединение его к модели Changerequest я получаю ошибку NoMethodError: undefined method 'changerequest_id' for #<Hash>

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

Это выглядит идентичный синтаксис для меня. Что дает?

ответ

0

Я обнаружил, что создание этих областей решить эту проблему:

В ChangerequestStatus.rb:

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

В Changerequest.rb:

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

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