Rails: найти, существует ли значение внутри столбца массива - PullRequest
0 голосов
/ 01 октября 2018

У меня есть таблица скидок со столбцом массива user_id.

 create_table "discounts", force: :cascade do |t|
 t.string "amount"
 t.string "name"
 t.string "from"
 t.string "to"
 t.integer "user_id", default: [], array: true

Я хочу найти всю таблицу скидок и найти только те строки, которые имеют user_id (current_user.id).

Есть идеи, как имплантировать этот поиск?

1 Ответ

0 голосов
/ 01 октября 2018
Discount.where(":user_id = ANY(user_id)", user_id: current_user.id)

Это должно сделать это для вас.Я предполагаю, что user_id является полем массива в базе данных postgres.

Я бы порекомендовал вам также индексировать user_id для большей производительности.Чтобы создать индекс для столбца массива, вы должны выбрать между GiST и GIN в качестве стратегий.Документация хорошо описывает опции, но, по сути, версия заключается в том, что поиск в GIN выполняется намного (в 3 раза) быстрее, но для сборки требуется больше времени (в 10 раз).Если ваши данные читаются гораздо чаще, чем пишутся, используйте GIN.

Ваша миграция может выглядеть примерно так:

create_table "discounts", force: :cascade do |t|
  t.string "amount"
  t.string "name"
  t.string "from"
  t.string "to"
  t.integer "user_id", default: [], array: true
end

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