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

时间:2014-10-20 22:39:00

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4

我有一个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')
)

对此有何帮助?

1 个答案:

答案 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,那么在问题中使用连接可能是唯一的方法。