#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']