2011-04-12 74 views
3

在Rails 3中,我試圖使用像self.children.joins(:parent).where(...).update_all(...)這樣的語句來選擇記錄的一個子集並全部更新它們。這工作使用MySQL,但不適用於PostgreSQL。 Rails語法錯了嗎?使用PostgreSQL的Rails 3:與連接表中的'update_all'問題

詳細

成員屬於家庭,家庭有許多成員。有關聲明是在一個家庭中的實例方法,所以「自我」是一個家庭:

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}") 

換句話說,對於這個家庭的成員的一個子集,家庭residence_location複製到成員residence_location。

這在MySQL中工作得很好。但是,當我更改爲PostgreSQL時,出現此錯誤:

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) 

我的Rails語句不正確,但恰巧在MySQL中工作?有沒有辦法解決它與PostgreSQL的工作?或者也許是一種使用MetaWhere的方式?

+0

更新SQL不是[有效期爲PostgreSQL的(http://www.postgresql.org/docs/ current/static/sql-update.html),MySQL有一個接受非標準SQL的壞習慣,從而破壞了年輕人。你需要說服AR產生'UPDATE members SET ... FROM families ...'。或者只需用'connection.execute()'手工完成。 – 2011-04-12 16:40:24

+0

謝謝,畝。奇怪的是,Rails生成無效查詢。 – 2011-04-13 11:44:14

+0

Rails始終會生成無效的SQL,因此所有關於爲何在部署到Heroku時都會中斷的問題。 – 2011-04-14 00:12:45

回答