Как запросить столбец массива из MySQL в Rails 5.2? - PullRequest
0 голосов
/ 28 ноября 2018

Я использую gem rails~> 5.2 и gem mysql2 >= 0.3.13, < 0.5.

У меня есть модель Lawer, в которой есть столбец массива lawer_filed [sic].

# Model lawer.rb

serialize :lawer_field, Array

Затем я создал Lawer, и я могу получить значение lawer_field следующим образом:

=> Lawer.first.lawer_field

=> ["2", "3", "5"] 

Теперь я хочу найти один Lawer сзапрос с использованием lawer_field.Я попытался:

@lawer = Lawer.where("lawer_field && ARRAY[?]", "2")

, что вызвало такую ​​ошибку:

ActiveRecord::StatementInvalid (Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '['2']) LIMIT 11' at line 1: SELECT  `lawers`.* FROM `lawers` WHERE (lawer_field && ARRAY['2']) LIMIT 11)

В моем синтаксисе SQL есть ошибка, но я не знаю, как ее исправить.Кто-нибудь может помочь?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Попробуйте @lawer = Lawer.where("'2' = ANY (lawer_field)"), если вы ищете одно поле.Попробуйте @lawer = Lawer.where("lawer_field @> ARRAY[?]::varchar[]", ["2", "3"]), если вы ищете несколько полей.

0 голосов
/ 28 ноября 2018

MySQL, в отличие от PostgreSQL, не поддерживает массивы в базе данных.Поэтому вам нужно было добавить эту строку:

serialize :lawer_field, Array

Это означает, что у вас есть поле string в вашей базе данных, но всякий раз, когда ActiveRecord распаковывает результаты, возвращенные базой данных, он сопоставляет их непосредственно с экземпляромRuby Array.Это означает, что ваша единственная возможность фильтровать результаты в базе данных - использовать любые функции сравнения строк MySQL, LIKE и т. Д.

Вы можете либо использовать LIKE, либо выполнить другие Строковые функции (которые не будут работать должным образом, так как вы не сможете использовать индексы) или построить другую таблицу, добавьте к ней ассоциацию has_many и используйте MySQL так, как это предполагалось.Конечно, вы также можете перейти на PostgreSQL, но это, пожалуй, самый экстремальный вариант.

РЕДАКТИРОВАТЬ: вы также можете рассмотреть возможность использования MySQL JSON , который был добавлен недавно.Это зависит от вашей версии MySQL, хотя.

0 голосов
/ 28 ноября 2018

Я не пробовал этот ответ, потому что у меня нет готового для тестирования проекта Rails, но я думаю, что проблема в синтаксисе.

Я думаю, что это должно быть примерно так:

Lawer.where("lawer_field IN (?)", "2")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...