Sql ActiveRecord查询以查找给定键的JSON值数组

Sql ActiveRecord查询以查找给定键的JSON值数组,sql,ruby-on-rails,json,postgresql,activerecord,Sql,Ruby On Rails,Json,Postgresql,Activerecord,在Rails 4中,我有一个带有JSON类型列的表。我有一个这样的方法 def self.that_match_property(key: "default", value: "default") where("properties ->> ? = ?", key, value) end 所以对于Model.first.properties我得到{“name”:“Bill”,“user\u id”:“1”} 我可以做得很好 Model.that_match_property(k

在Rails 4中,我有一个带有JSON类型列的表。我有一个这样的方法

def self.that_match_property(key: "default", value: "default")
  where("properties ->> ? = ?", key, value)
end
所以对于
Model.first.properties
我得到
{“name”:“Bill”,“user\u id”:“1”}
我可以做得很好

Model.that_match_property(key: "name", value: "Bill") 
我在json
properties
列中获取与键/值对匹配的一条或多条记录

但是。。。假设我希望该值是一个ID数组。所以我

user1.properties = {"name": "Bill", "user_id": "1"}
user2.properties = {"name": "Ted", "user_id": "2"}
user3.properties = {"name": "Rufus", "user_id": "3"}
现在我还有
bill_和

我希望能够做到这一点:

Model.that_match_property(key: "user_id", value: bill_and_ted_ids)
但这不起作用。通常,我可以将ID数组传递给活动记录查询,并将其转换为正确的sql


在Rails中使用JSON数据类型执行上述操作的正确方法是什么?

也许类似的方法会有所帮助:

def build_where_query_string_from_hash(hash)
  hash.collect do |k,v|
    if v.is_a?(Array)
      string = v.collect{|e| "(properties ->> '#{k}'='#{e}')"}.join(" OR ")
      "(#{string})"
    else
      "(properties ->> #'{k}'='#{v}')"
    end
  end.join(" AND ")
end
然后您可以传递:
build\u where\u query\u string\u from\u hash(用户\u id:[1,2],名称:[“Bill”,“Ted”])

返回:

((properties ->> 'user_id'='1') OR (properties ->> 'user_id'='2')) AND ((properties ->> 'name'='Bill') OR (properties ->> 'name'='Ted'))`

谢谢这个。。。我试图避免使用2个ruby循环。我已经让它工作了,我可以通过id循环并使用每个id调用该方法。我希望改进并使用ARs惰性评估来提高效率。