2016-03-21 1 views
0

Предположим, что существует модель под названием «Пользователь». У этого есть атрибут: хобби.Как искать модель, используя массив в .where?

user = User.first 
user.hobbies 
=> ["Bowling", "Cooking", "Knitting"] 

Если бы я хотел использовать. Где искал атрибут: hobbies, как бы я это сделал? Я использую PostgreSQL и

:hobbies, :text, array:true 

User.where (хобби: "Все, что я ставлю здесь, строковый массив, хэш") бросает ошибку

ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: malformed array literal: 

ответ

1

Помните, что вы можете использовать любой SQL вы хотите, передавая строку where, например:

User.where("hobbies @> ARRAY['Bowling', 'Cooking', 'Knitting']") 

или

User.where("hobbies && ARRAY['Bowling', 'Cooking', 'Knitting']") 

Postgres имеет имеется хорошая документация по array operators.

+0

Будет ли любой из них переводить на «WHERE hobbies IN (« Боулинг »,« Кулинария »,« Вязание »)? «Потому что это был бы оптимальный запрос. –

+0

'COUNT' не сообщает вам длину массива, но он сообщает вам, сколько * рядов * происходит в сворачивании в сводном запросе. Вот почему это всегда дает вам 1: независимо от того, как долго массив, есть еще одна строка. Вероятно, вам понадобится 'array_length (hobbies, 1)'. Но я на самом деле не уверен, что вы пытаетесь сделать, чтобы я мог ошибиться. –

+1

Причина, по которой вы не можете использовать 'IN', заключается в том, что' hobbies' не является строкой, а массивом строк. Поэтому вместо этого вы должны использовать операторы массива. '@>' означает, что «хобби» имеет все «Боулинг», «Кулинария» и «Вязание». '&&' означает, что у него есть хотя бы один из них. –

0

Вы можете попробовать contains или overlap из postgres_ext драгоценный камень. Просто установите камень, а затем запрос:

query = ["Bowling", "Cooking", "Knitting"] 

#With Overlap operator: 
User.where.overlap(hobbies: query) 

#or with Contains Operator 
User.where.contains(hobbies: query) 
+0

undefined метод 'overlap 'для # . То же самое касается содержит: l –

+0

А, мой плохой! Для этого вам понадобится ['postgres_ext'] (https://github.com/dockyard/postgres_ext). – Babar