我有一个想用ActiveRecord (Rails 4)编写的PostgreSQL查询,但我在让它正常工作时遇到了问题。
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')
)对此有什么帮助吗?
发布于 2014-10-21 09:16:41
由于Chat.update_all将添加UPDATE chats SET...,因此我能想到的唯一让rails使用别名(UPDATE chats AS c)进行更新的方法就是使用connection.update和sql字符串:
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片段,那就不好了,但是如果你想使用AREL,那么在你的问题中使用a join可能是唯一的方法。
https://stackoverflow.com/questions/26476096
复制相似问题