2011-02-09 4 views
1

내 직업 모델에 다음과 같은 범위가 있는데 내 명세서에 SQL 불일치 문제가있는 것 같습니다. 우리의 dev db는 mysql이었고 분명히 heroku는 postgres를 가지고 있으며 어떤 이유로 file_count로 불평을 계속합니다.postgres-mysql 문제에 대한 Activerecord 솔루션

이 스코프를 클래스 메소드로 변환하거나 최소한 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에 있어야합니다. GROUP BY에 jobs.id 만 있습니다.

쿼리를 변경하고 GROUP BY의 모든 열을 언급해야합니다.

또한 MySQL은이 구성에 문제가있어 많은 경우에 이상한/잘못된 결과가 생성됩니다. MySQL은 SQL- 모드 ONLY_FULL_GROUP_BY을 구현하여이 동작을 해제하고 MySQL은 이제 이와 같은 쿼리를 거부합니다.

ps. 검색어에 Don't use *이 있으면 아무도 결과가 무엇인지 알 수 없습니다.