Обновление нескольких строк в БД в Rails, каждая из которых имеет уникальные значения - PullRequest
0 голосов
/ 05 ноября 2018

Я тщательно исследовал это, и я не могу найти ответ, который мне нужен.

Я знаком с транзакциями Rails, но транзакция в этом случае будет выполнять несколько запросов, и я бы не стал этого делать.

Как в одном запросе как обновить один и тот же столбец в нескольких строках уникальными значениями?

Ex:

update_hash =  {1: 'Bandits on the High Road', 2: 'Broccoli: The Menace'}
Books.where(<id_is_in_update_hash_keys>).each do |b|
  matching_hash_key = b.id
  new_title = update_hash[:matching_hash_key].value
  # problem here because each update is a query
  b.update(title: new_title)
end

Конечно, я мог бы обернуть это в транзакцию, но книги по 10 тыс. По-прежнему вызывают запросы по 10 тыс. Я использую Postgresql, но я не знаю правильного идиоматического способа обновления этого поля для нескольких объектов в одном запросе. Данные были предварительно проверены, поэтому никогда не потребуется запускать проверки.

Если кто-нибудь знает либо код Rails для выполнения, либо, скорее всего, запрос Postgresql, который мне нужно сгенерировать, я был бы очень признателен.

1 Ответ

0 голосов
/ 05 ноября 2018

С PostgreSQL это возможно с помощью такого запроса:

update_hash = { 1: 'Bandits on the High Road', 2: 'Broccoli: The Menace' }
values = update_hash.map { |k, v| "(#{k}, #{ActiveRecord::Base.connection.quote(v)})" }.join(', ')

query = "
    UPDATE books T
    SET title = uv.new_title
    FROM (VALUES #{values}) AS uv (id, new_title)
    WHERE T.id = uv.id::int"

ActiveRecord::Base.connection.execute(query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...