2013-04-04 2 views
0

У меня есть запрос, который я запускаю на одной из моих страниц. Он в основном проходит через таблицу транзакций, присоединяется к платежам за каждую транзакцию (ассоциация «многие-к-одному»), вычисляет поле «баланс» в транзакции (с выбором), заказывает ее и возвращает верхнюю часть 10.ActiveRecord - не использовать включить при использовании порядка в вычисленном поле

это выглядит следующим образом:

@high_balance_transactions = Transaction. 
    joins(:payments). 
    select(["transactions.*", "SUM(...) as balance"]). 
    group(:id). 
    having("balance < 0"). 
    order(:balance). 
    limit(10) 

Тогда, на мой взгляд, я ставлю те в таблице и нужны данные от самих платежей, так что я в конечном итоге с большим количеством запросов («N + 1» проблемы. ..).

Я пытался добавить .includes(:payments) на запрос, но получил эту ошибку:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'balance' in 'order clause' 

я вижу в SQL, который следует за ошибку, которая ActiveRecord не добавляет мой вычисленное поле в запросе он делает, но удалил его только тогда, когда я добавил часть includes. Есть ли причина для этого?

Как я могу использовать как вычисленное поле (для заказа и наличия), так и включать данные оплаты только для записей, которые соответствуют всем критериям?

Спасибо!

ответ

0

При использовании includesselect игнорируется Rails, поэтому вы получаете ошибку (я нашел это в нескольких вопросах SO, но я не знаю причины этого поведения).

Я думаю, что вы можете решить вашу проблему, если переместить SUM(...) в having и order п

balance = 'SUM(...)' 
@high_balance_transactions = Transaction. 
    joins(:payments). 
    includes(:payments). 
    group('payments.id'). 
    having("#{balance} < 0"). 
    order(balance). 
    limit(10) 

Это не очень хороший в запросе SQL, но это, конечно, не будет влиять на эти характеристики, BD вычислит его только один раз.

+0

Спасибо! оно работает. Действительно не самый красивый SQL, но теперь все остальные запросы показаны как CACHE, а не Load и принимают 0ms .. :) –

Смежные вопросы