Rails/Postgres Как запросить значение hstore, если оно содержит значение переданного массива

Я использую Postgres с hstore в своем проекте Rails. Я храню информацию об адресе (улица, город, почтовый индекс, страна и т. д.) в столбце hstore под названием «адрес». Я могу запросить базу данных для определенного города следующим образом:

Company.where("address -> 'country' = 'Finland'")

Работает отлично.

То, что я хотел бы сделать, это запросить базу данных для массива стран, подобных этому:

Company.where("address -> 'country' IN my_array_of_many_countries")

Конечно, это так не работает. Кто-нибудь знает, как я могу получить все компании из стран, хранящихся в моем массиве my_array_of_many_countries?

Любая помощь высоко ценится.


person Oliver Schobel    schedule 18.03.2015    source источник


Ответы (2)


Самым простым решением было бы преобразовать массив в строку:

my_array_of_many_countries = ['France', 'Germany']
my_array_of_many_countries_string = "'#{my_array_of_many_countries.join("','")}'"
Company.where("address -> 'country' IN (#{my_array_of_many_countries_string})")

Это будет работать, только если ваш массив содержит только строки. Кстати, не проверял.

person MurifoX    schedule 18.03.2015
comment
Мой массив содержит только строки. Я попробовал, и все работает нормально. Большое спасибо. - person Oliver Schobel; 18.03.2015
comment
Вы действительно предлагаете кому-то использовать интерполяцию строк с SQL в 2015 году без должного экранирования всего? - person mu is too short; 18.03.2015
comment
@muistooshort Как видно из примера, my_array_of_many_countries никоим образом нельзя внедрить, так как он создается локально, а не получен из параметров или чего-то еще, так что да, я. - person MurifoX; 18.03.2015
comment
Это по-прежнему ужасная идея, когда есть лучшие способы сделать это, которые не сломаются, когда название страны содержит апостроф. - person mu is too short; 18.03.2015
comment
Я благодарен за оба ответа. MurifoX помог мне сразу запустить эту часть приложения. Учитывая дальнейшее развитие, я решил пойти на слишком короткий ответ. Если когда-нибудь страны будут переданы из-за пределов приложения, я буду в большей безопасности. Спасибо вам обоим. - person Oliver Schobel; 20.03.2015

ActiveRecord знает, что делать с массивами Ruby, так что пусть он делает свою работу:

Company.where("address -> 'country' IN (?)", my_array_of_many_countries)

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

person mu is too short    schedule 18.03.2015