2017-06-05 34 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