Hstore PostgreSQL数组比较任何数组,Rails 3

时间:2015-12-01 04:04:50

标签: ruby-on-rails arrays postgresql hstore

感谢您的时间:

我有一组记录(用户具体),其中Hstore哈希保存在"数据"领域。问题是我想制作一个SQL来从该组用户中获取用户,其中哈希hstore已保存属性" data"字段匹配另一个字符串数组值,如下所示:

数据:{" foo" => ""," bar" => "酒吧"," baz" => " bazz" }

匹配的字符串数组[" foos"," bazz"]

注意:我想匹配值,而不是键

每个用户都有一组"数据" foo / bar / bas属性,我发送一组"键"从哈希中提取并比较第二个"值"数组,但我似乎无法进行单一的SQL匹配。到目前为止,这就是我的全部内容:

keys = ["foo", "baz"]
values_to_match = ["bars", "bazz"]
users.where("users.data -> ARRAY[?] ILIKE ANY (ARRAY[?])", keys, values_to_match)

2 个答案:

答案 0 :(得分:1)

假设您正在为模型User编写类方法,您可以想到一个天真的SQL解决方案:

def self.matched_users(keys, values_to_match)
  result = self
  keys.each_with_index do |key, index|
    result.where("users.data -> ? ILIKE ?", key, "%#{values_to_match[index]}%")
  end
  result
end

或者传递哈希

def self.matched_users(hash)
  hash.inject(users) do |result, (key, value)|
    result = result.where("users.data -> ? ILIKE ?", key, "%#{value}%")
  end
end

答案 1 :(得分:0)

我找到了一个简单的SQL解决方案:

users.where("(users.data -> ARRAY[?]) && (ARRAY[?])", keys, values_to_match)

似乎数组的交叉点正确地比较了用户数据字段中的值,即使文档说它返回的哈希值如下:

  

hstore - > ARRAY [键] |结果:{“value”,“value”}

感谢所有花时间回答或阅读的人的时间,如果有人能澄清为什么会这样,我会感激不尽