2011-02-09 6 views
1

У меня есть следующие области видимости в моей модели работы, и, похоже, есть проблема с некоторыми несоответствиями SQL в моих операторах. Наш dev db был mysql, и, по-видимому, у героку есть postgres и он по-прежнему жалуется как file_count.Решение Activerecord для проблем postgres-mysql

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

Я планирую сохранить 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 

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

Работа имеет много audio_files и AudioFile принадлежит работа.

ответ

5
.select("jobs.*, COUNT(*) AS file_count") 
.group("jobs.id") 

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

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

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

Ps. Don't use * в ваших запросах никто не знает, какими могут быть результаты.

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