感谢您的时间:
我有一组记录(用户具体),其中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)
答案 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”}
感谢所有花时间回答或阅读的人的时间,如果有人能澄清为什么会这样,我会感激不尽