2015-12-01 2 views
0

Спасибо за ваше время:Hstore PostgreSQL Массив Comparision любой в массиве, Rails 3

У меня есть группа записей (пользователи конкретны) с хэш Hstore сохраненным в поле «данных». Дело в том, что я хочу сделать один SQL для извлечения пользователей из этой группы пользователей с сохраненным свойством hash hstore в этом поле данных, соответствующих другому массиву значений строк:

данные: {"foo" = > "", "бар" => "бары", "Баз" => "Базз"}

массив строк, чтобы соответствовать [ "FOOS", "Базз"]

ПРИМЕЧАНИЕ: Я хочу, чтобы соответствовать значения, НЕ ключи

У каждого пользователя есть набор свойств «данных» 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

Я нашел простое решение SQL:

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

Похоже, пересечение массивов сравнивает правильно значения из поля данных пользователей даже то документация говорит, что это возвращает хэш, как:

hstore -> ARRAY [ключи] | Результат: { «значение», «значение»}

спасибо за ваше время, чтобы все те, кто принял свое время, чтобы ответить или прочитать, если кто-нибудь может пояснить, почему это происходит, я бы благодарностью

1

Предполагая, что вы пишете метод класса для модели пользователя, вы могли бы думать о наивном решении 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

Я Попробуем попробовать, но не существует ли более SQL, как элегантное решение, которое не включает итерацию ruby? это больше похоже на улучшение, потому что исходный запрос выполняет итерацию над пользовательским массивом и делает SQL-запрос для каждого пользователя, что очень неэффективно, и сложность SQL-запросов не очень изящна или понятна, я думаю, я попробую это так или иначе, это дает мне какое-то направление thanx –