首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ActiveRecord update_all和Rails 4批量更新连接表

使用ActiveRecord update_all和Rails 4批量更新连接表
EN

Stack Overflow用户
提问于 2014-10-21 06:39:00
回答 1查看 1.8K关注 0票数 1

我有一个想用ActiveRecord (Rails 4)编写的PostgreSQL查询,但我在让它正常工作时遇到了问题。

代码语言:javascript
复制
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'

这是我尝试过的:

代码语言:javascript
复制
Chat.joins(:messages)
  .where("message.created_at >= '2014-10-10'")
  .update_all('chat.email = message.source_name')

但是它创建了一个查询,如下所示:

代码语言:javascript
复制
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')
)

对此有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2014-10-21 09:16:41

由于Chat.update_all将添加UPDATE chats SET...,因此我能想到的唯一让rails使用别名(UPDATE chats AS c)进行更新的方法就是使用connection.update和sql字符串:

代码语言:javascript
复制
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可能是唯一的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26476096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档