Рельсы 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, или имеет пунктуацию или что-то еще необычное).