如何使用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'变量中的值。
答
有用于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
你为什么要使用hstore这个?看起来像一个单独的表格将是合适的,可能更容易处理。 –
这是数据库模型的一般化。例如,我们有其他hstore列存储照片的元数据。 – mightochondria