Как выполнить поиск в столбце массива с несколькими значениями в postgresql rails

#ruby-on-rails #ruby #postgresql

#ruby-on-rails #ruby #postgresql

Вопрос:

у меня есть две две модели post , tags и я хочу получить post, где есть некоторые теги.

  • tag.rb
 post_id  integer  3
tags     array  {'v1', 'v2'}
  

когда поиск в модели тегов работает Tag.where('tag amp;amp; array[['v1', 'v2']]')

но при добавлении этого в post не работает Post.where('tags.tags amp;amp; array[['v1', 'v2']]')

у каждого сообщения есть один тег

Комментарии:

1. Вы используете array в Post модели для хранения массива Tag идентификаторов, чтобы вы могли связывать теги с записями, это правильно? Если да, то почему бы не использовать ассоциации?

2. У Post уже есть тег has_one, что ты, почему бы не использовать ассоциацию

3. Извините, я неправильно прочитал и недопонял. Похоже, что Post имеет одно Tag значение, а Tag хранит массив tags . Это правильно?

4. Да, именно сейчас

Ответ №1:

Самый прямой / необработанный способ сделать это был бы примерно таким:

 Post.joins(:tags).where("ARRAY['v1', 'v2'] <@ tags.tags")
  

Обязательное предупреждение о введении введенных пользователем значений в строки, отправляемые в базу данных, для WHERE предложения.

Комментарии:

1. спасибо @kache, я пробую, что ваше решение работает, но при использовании динамического значения не работает " ARRAY#{tags} amp;amp; tags.tags"

2. Если tags.to_s не выводится что-либо сериализованное в форме ['v1', 'v2'] , то это не сработает. Вы также используете неправильный оператор.

3. я знаю, что необходимо использовать массив тегов, например " ARRAY["v1"] <@ tags.tags"

4. ActiveRecord::StatementInvalid (PG::UndefinedColumn: ОШИБКА: столбец «v1» не существует

5. Опять же, ['v1'] это не то же самое, что ["v1"] . Используйте одинарные кавычки: ['v1', 'v2']