我有一个PostgreSQL查询,我想在ActiveRecord(Rails 4)中编写,但我无法让它正常工作。
UPDATE chats AS c
SET email = m.source_name
FROM messages AS m
WHERE c.id = m.chat_id
AND m.created_at >= '2014-10-10'
这是我尝试过的:
Chat.joins(:messages)
.where("message.created_at >= '2014-10-10'")
.update_all('chat.email = message.source_name')
但它会创建一个这样的查询:
UPDATE "chats"
SET chat.email = message.source_name
WHERE "chats"."id" IN (
SELECT "chats"."id"
FROM "chats"
INNER JOIN "messages"
ON "messages"."chat_id" = "chats"."id"
WHERE (message.created_at >= '2014-10-10')
)
对此有何帮助?
答案 0 :(得分:1)
由于Chat.update_all
将添加UPDATE chats SET...
,因此我可以通过UPDATE chats AS c
使用connection.update
来了解使用别名(Chat.connection.update(Q%{
UPDATE chats AS c
SET email = m.source_name
FROM messages AS m
WHERE c.id = m.chat_id
AND m.created_at >= '2014-10-10'
});
)进行更新的唯一方法sql string:
{{1}}
如果您想要避免使用SQL片段,那就不是很好了,但如果您想使用AREL,那么在问题中使用连接可能是唯一的方法。