Решение Activerecord для проблем postgres-mysql - PullRequest
1 голос
/ 09 февраля 2011

У меня есть следующие области действия в моей модели Job, и кажется, что есть проблема с некоторыми несоответствиями SQL в моих утверждениях.Нашим разработчиком была база данных mysql, и, очевидно, у heroku есть postgres, и он почему-то продолжает жаловаться на file_count.

Я планирую просто преобразовать эти области в методы класса или, по крайней мере, изменить операторы SQL в методы активной записи,может быть независимым от БД.Возможно ли это вообще, и как мне начать с этого?

Я планирую сохранить is_active, потому что я почти уверен, что это работает, поскольку это простое утверждение области видимости, но with_unclassified_files_available_count нуждается в рефакторе, и я думаюРефакторинг AR был бы хорошей идеей (если вы считаете, что это не очень хорошая идея, пожалуйста, скажите мне, я открыт для предложений)

Вот код:

scope :is_active, where(:active => true)
scope :with_unclassified_files_available_count, where("audio_files.category_id IS NULL")
                                              .joins(AUDIO_FILES)
                                              .select("jobs.*, COUNT(*) AS file_count")
                                              .group("jobs.id")
                                              .order("batch_identifier DESC")
scope :has_files_available, with_unclassified_files_available_count.having("count(*) > 0")
scope :available_to_work_on, is_active.has_files_available

Дополнительная информация:

В задании много аудиофайлов, а аудиофайл принадлежит заданию.

1 Ответ

5 голосов
/ 09 февраля 2011
.select("jobs.*, COUNT(*) AS file_count")
.group("jobs.id")

Никакая база данных, кроме MySQL, не примет эту конструкцию. Каждый столбец, который вы упоминаете в разделе SELECT и который не входит в агрегатную функцию (например, COUNT, MIN, MAX), ДОЛЖЕН быть в GROUP BY. У вас есть только job.id в GROUP BY.

Вы должны изменить свой запрос и указать все столбцы в GROUP BY.

MySQL также имеет проблемы с этой конструкцией, во многих случаях она дает странные / неправильные результаты. MySQL реализовал SQL-режим ONLY_FULL_GROUP_BY , чтобы отключить это поведение, MySQL теперь также будет отклонять запросы, подобные этому.

Ps. Не используйте * в своих запросах, никто не знает, какими могут быть результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...