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

回答