如何使用ruby在postgres中对hstore列执行复杂更新?

问题描述:

我在这个红宝石SQL查询,以更新的Postgres的hstore列如何使用ruby在postgres中对hstore列执行复杂更新?

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"]) 

而是使用'data'变量中的值。

+0

你为什么要使用hstore这个?看起来像一个单独的表格将是合适的,可能更容易处理。 –

+0

这是数据库模型的一般化。例如,我们有其他hstore列存储照片的元数据。 – mightochondria

有用于hstore宝石像这样的:https://github.com/diogob/activerecord-postgres-hstore

或通过创建您自己的帐户对象使用一个简单的更新: http://apidock.com/rails/ActiveRecord/Relation/new

+0

我们使用hstore宝石。问题在于,在ruby中更新hstore的选项并不多。我们可以做以下两件事之一:1)用不同的数据一次更新一行(即data.map {| id,book,movie | Account.where(origin_id_str:id).update(“favorites = hstore(” ...“))},但是这会花费很多我们想要避免的数据库调用2)使用一个数据库调用来更新表中的所有行,但是这使得不可能对每个数据库应用不同的值除非我们在sql中写入查询。 – mightochondria