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