ActiveRecord Query查找给定Key的JSON Value Array

时间:2015-05-14 22:07:15

标签: 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_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_and_ted_ids = ["1", "2"]

我希望能够做到这一点:

Model.that_match_property(key: "user_id", value: bill_and_ted_ids)

但这不起作用。通常我可以将ID数组传递给活动记录查询,并将其转换为正确的sql。

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

1 个答案:

答案 0 :(得分:0)

也许这样的事情会有所帮助:

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_where_query_string_from_hash(user_id: [1,2], name: ["Bill", "Ted"])

返回:

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