2014-03-25 70 views
2

我在這個紅寶石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

回答

0

有用於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

相關問題