首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于查找给定键的JSON值数组的ActiveRecord查询

用于查找给定键的JSON值数组的ActiveRecord查询
EN

Stack Overflow用户
提问于 2015-05-15 06:07:15
回答 1查看 1.7K关注 0票数 2

在Rails4中,我有一个带有JSON类型列的表。我有一个运行良好的方法,如下所示

代码语言:javascript
运行
复制
def self.that_match_property(key: "default", value: "default")
  where("properties ->> ? = ?", key, value)
end

所以对于Model.first.properties,我得到了{"name": "Bill", "user_id": "1"},我可以很好地做到这一点。

代码语言:javascript
运行
复制
Model.that_match_property(key: "name", value: "Bill") 

然后我将获得与json properties列中的键/值对匹配的一个或多个记录。

但是..。假设我希望值是一个I数组。所以我有..。

代码语言:javascript
运行
复制
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"]

我希望能够做到这一点:

代码语言:javascript
运行
复制
Model.that_match_property(key: "user_id", value: bill_and_ted_ids)

但这不管用。通常,我可以将it数组传递给活动记录查询,然后它会转换为正确的sql。

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

EN

回答 1

Stack Overflow用户

发布于 2015-05-15 16:55:04

也许像这样的东西会很有帮助:

代码语言:javascript
运行
复制
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"])

它返回:

代码语言:javascript
运行
复制
((properties ->> 'user_id'='1') OR (properties ->> 'user_id'='2')) AND ((properties ->> 'name'='Bill') OR (properties ->> 'name'='Ted'))`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30248270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档