Рельсы 3 Отчета о заказах по внукам

Я пытаюсь сделать довольно сложную сортировку записей, с которой у меня возникли проблемы. У меня есть три модели:

    class User < ActiveRecord::Base

    has_many :registers
    has_many :results, :through => :registers

    #Find all the Users that exist as registrants for a tournament
    scope :with_tournament_entrees, :include => :registers, :conditions => "registers.id IS NOT NULL"

end

регистр

class Register < ActiveRecord::Base
  belongs_to :user
  has_many :results
end

Результат

class Result < ActiveRecord::Base
  belongs_to :register 
end

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

User.with_tournament_entrees

При этом я могу просто пройтись по возвращенным пользователям и запросить каждую отдельную запись со следующим, чтобы получить для каждого пользователя "Total Wins":

user.results.where("win = true").count()

Однако я также хотел бы пойти дальше и упорядочить всех пользователей по их "Total Wins", и это лучшее, что я мог придумать:

User.with_tournament_entrees.select('SELECT *, 
                                    (SELECT count(*)  
                                     FROM results 
                                     INNER JOIN "registers" 
                                     ON "results"."register_id" = "registers"."id" 
                                     WHERE "registers"."user_id" = "users.id" 
                                     AND (win = true)
                                    ) AS total_wins 
                                     FROM users ORDER BY total_wins DESC')

Я думаю, что это близко, но на самом деле он не упорядочен по total_wins в порядке убывания, как я проинструктировал. Я использую базу данных PostgreSQL.

Редактировать:

На самом деле происходит три выбора, первый происходит на User.with_tournament_entries который просто выполняет быстрый фильтр на пользовательской таблице. Если я проигнорирую это и попробую

SELECT *, (SELECT count(*) FROM results INNER JOIN "registers" ON "results"."register_id" = "registers"."id" WHERE "registers"."user_id" = "users.id" AND (win = true)) AS total_wins FROM users ORDER BY total_wins DESC; 

это терпит неудачу как в PSQL, так и в консоли ERB. Я получаю сообщение об ошибке:

PGError: ERROR: column "users.id" does not exist

Я думаю, что это происходит из-за того, что inner-select происходит раньше, чем external-select, поэтому у него нет доступа к идентификатору пользователя до этого. Не уверен, как дать ему доступ ко всем идентификаторам пользователей до того, как произойдет внутренний выбор, но это не проблема, когда я делаю User.with_tournament_entires с последующим запросом.

1 ответ

Решение

В вашем SQL, "users.id" указан неверно - он говорит Postgres искать столбец с именем, буквально "users.id".

Так должно быть "users"."id", или просто users.id (вам нужно только заключить его в кавычки, если у вас есть имя таблицы / столбца, которое конфликтует с ключевым словом postgres, или имеет пунктуацию или что-то еще необычное).

Другие вопросы по тегам