Hstore Query для поиска записей, соответствующих любому элементу массива, используя ruby ​​на рельсах - PullRequest
1 голос
/ 18 июня 2019

У меня есть поле hstore в таблице базы данных.Я хочу написать запрос, чтобы найти записи, соответствующие любому элементу массива, в любом хеш-поле hstore , используя ruby ​​on rails.

 Users Table
 --------------------------------------------------------------------------------
        ID    Name    sectors(hstore) 

        1     Piotr   {"aviation"=>"0", "oil_and_gas" => "50", "transport" => "50"}
        2     reza    {"oil_and_gas" => "70", "energy" => "30"}
        3     pat     {"transport" => "40", "energy" => "60"}
        4     Kim     {"infrastructure" => "20", "healthcare" => "20", "industrial" => "60"}

, учитывая приведенные выше тестовые данные, я хочу написатьзапрос к полю hstore, чтобы получить все записи, имеющие любой ключ, например ['oil_and_gas', 'energy', 'transport']

Я могу сопоставить и найти записи одного сектора, как указано в https://nandovieira.com/using-postgresql-and-hstore-with-rails,, ноМое требование - найти любую запись, в которой хеш hstore имеет какой-либо один ключ, совпадающий с любым одним элементом массива.

Я использую Rails 5.1.6.2, ruby ​​2.5.3

1 Ответ

1 голос
/ 18 июня 2019

Может быть, вы ищете следующего оператора:

hstore ? key # does hstore contain key?

Запрос может выглядеть так:

User.where("sectors ? 'oil_and_gas'")
    .or("sectors ? 'energy'")
    .or("sectors ? 'transport'")

Согласно postgresql документам

Проверка конкретного ключа в столбце hstore. Вы можете проверить наличие определенного ключа. введите столбец hstore, используя? оператор в предложении WHERE. За Например, следующий оператор возвращает все строки с атрибутом attr ключевой издатель.

SELECT
  title,
  attr->'publisher' as publisher,
  attr
FROM
  books
WHERE
  attr ? 'publisher';
...