2016-10-31 4 views
1

私はhouseモデルと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%")。これはまた、sleepingasleepのようなものをキャッチすることに注意してください。

クエリの管理を強化する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がエラーになることを意味する配列を返します。あなたが欲しい:

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

そして、ええ、幸せになるためにそこにワイルドカードが必要です。属性値内で「スリープ」を見つける必要がない場合は、LIKEを使用する必要はありません。

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

.uniqも少し私のところに飛び出します。 Houseテーブルに重複が含まれていますか?もしそうなら、それはおそらく必要ではない(すなわち、「はべきではない」)。

関連する問題