2016-10-31 3 views
1

У меня есть модель дома и business_model []. Этот столбец можно установить так: «бодрствовать», «спать» или «бодрствовать, спать» с помощью переключателей, всей строки. Я хотел бы, чтобы все дома включали business_model как «бодрствование», например.Rails LIKE - запрос не работает должным образом

@house = (House.all).uniq.where("business_model like ?", "sleep") 

Я пробовал этот код. Он работает только в том случае, если столбец просто «сон». Когда он «бодрствует, спит», он возвращает ноль.

Почему?

+0

Просто обратите внимание, что ваш код вызывает 'where' в массиве результирующего набора. Возможно, вы захотите освежить интерфейс ActiveRecord. Что-то вроде 'House.where ('business_model LIKE?', '% Sleep%')' - это то, что вам нужно. – coreyward

+1

@ henners66 Нет, никогда не обращайтесь к [w3fools] (http://w3fools.com), обратитесь к документации [PostgreSQL] (https://www.postgresql.org/docs/current/static/functions-matching.html) при использовании PostgreSQL. –

ответ

6

Вам нужно бросить туда какие-то дикие карты. Попробуйте where("business_model like ?", "%sleep%"). Обратите внимание, что это также поймает такие вещи, как sleeping и asleep.

Возможно, вам захочется использовать столбец базы данных JSON, который даст вам больше контроля над запросом.

+0

Зачем ему нужен столбец JSON? – coreyward

+0

Слишком много вещей может пойти не так, как строки с разделителями-запятыми. Что делать, если столбец базы данных заканчивается «A, B», но запрос приходит в «B, A» (потому что когда-нибудь он захочет запросить несколько экземпляров). В основном просто чувствуйте, что база данных хороша для хранения конкретных данных, поэтому зачем и делать DIY. –

+0

https://www.postgresql.org/docs/9.4/static/textsearch.html – coreyward

3

Вы все перепутались. House.all собирается вернуть массив, что означает, что ошибка .where будет ошибкой, потому что вы не вызываете ее на экземпляр ActiveRecord::Relation. Вы хотите:

House.where("business_model LIKE ?", "sleep").uniq 

И да, вам нужен шаблон, чтобы ЛЮБОВЬ был счастлив. Если вам не нужно находить «сон» в пределах значения атрибута, вам не нужно использовать LIKE.

House.where("business_model LIKE ?", "sleep%").uniq 

.uniq также выскакивает у меня мало, хотя. Имеет ли таблица House дубликаты? Если это так, то, вероятно, нет (т. Е. «Не должно быть»).