Как выполнить сложное обновление столбца hstore в postgres с помощью ruby?

У меня есть этот sql-запрос в ruby ​​для обновления столбца hstore в postgres.

query = %Q{UPDATE accounts SET favorites =
    hstore(ARRAY['favorite_book', user.book, 'favorite_movie', user.movie])
    FROM (VALUES #{data} ) AS user(id_str, favorite_book, favorite_movie)
    WHERE accounts.original_id_str = user.id_str;}

где данные - это строка, которая выглядит так

data = "('3082633', 'FavoriteBook1', 'FavoriteMovie1'),('1768517', 'FavoriteBook2', 'FavoriteMovie2'),('8245997', 'FavoriteBook3', 'FavoriteMovie3')"

Прямо сейчас я обновляю таблицу базы данных, вызывая

Account.connection.execute(query)

Но есть ли способ преобразовать как можно больше запросов в ruby ​​вместо sql? Например, что-то вроде

add_to_hstore = %(favorites = hstore(?, ?))
Account.update_all([add_to_hstore, "favorite_book", "LOTR"])

но вместо этого используйте значения из переменной «данные».


person mightochondria    schedule 25.03.2014    source источник
comment
Почему вы используете hstore для этого? Похоже, что отдельная таблица была бы подходящей и, вероятно, с ней было бы легче работать.   -  person mu is too short    schedule 25.03.2014
comment
Это обобщение модели базы данных. У нас есть другие столбцы hstore, в которых хранятся, например, метаданные фотографии.   -  person mightochondria    schedule 26.03.2014


Ответы (1)


Для hstore есть такие жемчужины: https://github.com/diogob/activerecord-postgres-hstore

или вы используете простое обновление, создав собственный объект учетной записи: http://apidock.com/rails/ActiveRecord/Relation/new

person andoke    schedule 25.03.2014
comment
Мы используем гем hstore. Проблема в том, что вариантов обновления hstore в ruby ​​не так много. Мы можем сделать одно из двух: 1) Обновить отдельные строки по одной с разными данными (например, data.map{ |id, book, movie| Account.where(origin_id_str: id).update(favorites = hstore(.. .)) }, но это потребовало бы большого количества вызовов базы данных, которых мы хотим избежать 2) Обновить все строки в таблице, используя один вызов базы данных, но это делает невозможным применение разных значений к каждой из строк, если мы написать запрос в sql. - person mightochondria; 26.03.2014