2017-06-05 32 views
0

我使用Postgres作爲我的數據庫,並且我的拍賣模型中有一列作爲jsonb列。我想創建一個查詢來搜索Auction的json列,以查看用戶的姓名或電子郵件是否存在於任何拍賣實例的json列中。AR Query for jsonb屬性列

現在我有@auctions = Auction.where('invitees @> ?', {current_user.name.downcase => current_user.email.downcase}.to_json),但只能帶回確切的key => value匹配我想知道名稱或電子郵件是否存在。

回答

2
  1. 您正在使用@>運算符。它的描述是這樣的:

    「請問左JSON值包含正確的JSON路徑/值項 在頂層?」

    你可能想在?運營商,如果你想當鍵(名字在你的情況下)匹配時返回一行。

  2. 沒有一種好的方法只在JSON列(see this answer for more details)中搜索值,但是您可以檢查密鑰是單獨存在還是存在密鑰和值匹配。

  3. 相同的ActiveRecord的方法和使用非JSON列時,即wherewhere(…).or(where(…))鏈應用爲:

    class Auction 
        def self.by_invitee(user) 
        name = user.name.downcase 
        json = { name => user.email } # note: you should be downcasing emails anyways 
        where('invitee ? :name', name: name).or(
         where('invitee @> :json', json: json) 
        ) 
        end 
    end 
    
0

這只是一個臨時補丁,直到我添加Invite模式,但鑄造被邀請人列到文本我可以搜索列。像這樣

SELECT * FROM auctions 
WHERE data::text LIKE "%#{string I'm searching for}%" 

所以,AR:

Auction.where('data::text LIKE ?', "%#{string I'm searching for}%") 
+0

FWIW,這將是很慢相比JSONB查找,尤其是因爲你鑄造每一行都在表中的文本,然後搜索它沒有任何索引。 – coreyward