использование WHERE для столбца, который является массивом, не работает - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть таблица со столбцом, который является массивом.В таблице есть записи с массивом ["something","another thing"] в столбце values.Но они почему-то не отображаются при выполнении запроса where.Так что я не уверен, что делаю не так.

# schema
t.text "values", default: "--- []\n"

# model
serialize :values, Array

# rails console
> Table.where(values: ["something","another thing"])
SELECT "tables".* FROM "tables" WHERE "tables"."values" IN ('something', 'another thing')
 => #<ActiveRecord::Relation []> 

Итак, идеальный вывод SQL, который я хочу создать, вероятно, выглядит как ...

SELECT "tables".* FROM "tables" WHERE "tables"."values" = ?  [["values", ["something", "another thing"]]]

вместоIN запрос о создании массива

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я могу согласиться с тем, что поиск по сериализованным данным может быть неэффективным.Но вот решение, с которым я столкнулся.

# model
scope :matching_values, -> (values) { where(matching_value_query(values, 'AND')) }
scope :subset_of_values, -> (values) { where(matching_value_query(values, 'OR')) }

def self.matching_value_query(values, condition_separator = 'OR')
  values.map { |value| "(values LIKE '%#{value}%')" }.join(" #{condition_separator} ")
end

# rails console
Table.matching_values(["something","another"])
 SELECT "tables".* FROM "tables" WHERE ((values LIKE '%something%') AND (values LIKE '%another%'))
=> #<ActiveRecord::Relation [ full of stuff ]
0 голосов
/ 18 февраля 2019

Поскольку столбец сериализован в виде массива, требуемое значение будет сохранено как

"---\n- something\n- another thing\n"

в базе данных, которая является строкой.

Чтобы найти такую ​​запись через SQL,к сожалению, вам придется полагаться на LIKE

Table.where(["values LIKE ?", '%something\n- another thing%'])

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

Поиск по сериализованным столбцам - это просто то, что не должно быть сделано.

...