2011-04-12 2 views
3

레일즈 3에서는 self.children.joins(:parent).where(...).update_all(...)과 같은 구문을 사용하여 레코드의 하위 집합을 선택하고 모두 업데이트하려고합니다. 이 작업은 MySQL을 사용하지만 PostgreSQL에서는 작동하지 않습니다. Rails 구문이 잘못 되었습니까?레일 3와 PostgreSQL : 'update_all'with joined table

세부

회원은 가족, 가족이 많은 회원이 속한다. 문제의 문은 가족 인스턴스 메소드에, 그래서 "자기"는 가족 : 멤버 residence_location에 가족 residence_location 복사,이 가족의 구성원의 하위 집합에 대한, 즉

self.members.joins(:family). 
    where('spouse_id > 0 OR child OR members.id = families.head_id'). 
    update_all("members.residence_location_id = #{self.residence_location_id}") 

.

이것은 MySQL에서 완벽하게 작동했습니다.

PGError: ERROR: syntax error at or near "INNER" 
LINE 1: UPDATE "members" INNER JOIN "families" ON "families"."id" = ... 

UPDATE "members" INNER JOIN "families" ON "families"."id" = "members"."family_id" 
    SET members.residence_location_id = 27 
    WHERE ("members".family_id = 425) AND 
     (spouse_id > 0 OR child OR members.id = families.head_id) 

내 레일 문이 잘못하지만 단지 MySQL의에서 작업 할 일이 : 나는 PostgreSQL을 변경하는 경우, 그러나, 나는이 오류가? PostgreSQL에서 작동하도록 수정하는 방법이 있습니까? 아니면 MetaWhere를 사용하는 방법일까요?

+0

업데이트 SQL이 아닌 ([PostgreSQL의 유효] http://www.postgresql.org/docs/ current/static/sql-update.html), MySQL은 비표준 SQL을 받아들이지 않아서 청소년을 부패시키는 나쁜 습관을 가지고 있습니다. AR을 설득하여 'UPDATE 구성원 SET ... FROM families ...'을 생성해야합니다. 아니면 그냥'connection.execute()'를 사용하여 직접 할 수 있습니다. –

+0

감사합니다, 뮤. Rails가 잘못된 쿼리를 생성하는 이상한 점이 있습니다. –

+0

레일스는 항상 유효하지 않은 SQL을 생성합니다. 따라서 Heroku에 배포 할 때 상황이 어떻게 깨지는 지에 대한 모든 질문을합니다. –

답변