2014-10-20 2 views
0

У меня есть запрос PostgreSQL, который я бы хотел написать в ActiveRecord (Rails 4), но у меня возникли проблемы с его правильной работой.Массовое обновление объединенной таблицы с ActiveRecord update_all и 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

С Chat.update_all добавит UPDATE chats SET... единственным способом, которым я могу думать ПОЛУЧИТЬ рельсы сделать обновление с псевдонимом (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.

+0

Вы также можете использовать оператор 'execute'. –

Смежные вопросы