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的方式?
更新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
謝謝,畝。奇怪的是,Rails生成無效查詢。 – 2011-04-13 11:44:14
Rails始終會生成無效的SQL,因此所有關於爲何在部署到Heroku時都會中斷的問題。 – 2011-04-14 00:12:45