2016-05-12 8 views
2

私はnameフィールドのUsersテーブルを持っています。このフィールドにはユーザーのフルネームが含まれています。stringのILIKE検索は、最初の部分でのみ機能しますか?

ユーザーを姓または名字で検索できる検索機能を作成しましたが、最初の名前の検索結果のみが返されます。

たとえば、ユーザーがuser.name = 'John Smith'の場合、「John」と入力するとレコードが返されますが、「Smith」と入力すると結果は表示されません。ここに検索コードがあります:

name_users = User.where('name ILIKE ?', params["search_text"] + '%').all 

姓で検索するにはどうすればよいですか?

+1

'name_usersは= User.where( '名前ILIKE?'、「%の#,:クエリの先頭に%を追加することにより、最初と最後の両方に一致する必要があります{params ["search_text"]}% ")。all' - これを試してください – dp7

答えて

2

を必要としない

query = "%#{params['name']}%" 
User.where('name ILIKE ?', query) 

文字列の最初の名前だけで一致させることができます。姓は文字列の前に文字があるため、一致しません。 Postgres docs

LIKEパターンマッチは常に文字列全体をカバーします。文字列内の任意の場所にパターンをマッチさせるには、パターンをパーセント記号で開始して終了する必要があります。

あなたは

name_users = User.where('name ILIKE ?', "%#{params["search_text"]}%")

+0

.allは必要ありません。 –

+0

@pascalbetzはい、必要ありません – dp7

1

SQLのすべての機能を使用できます。したがって、検索するテキストの前に別の%を追加して、列の任意の位置で文字列の一致を検索することを示すことができます。パターンマッチングを行う

name_users = User.where('name ILIKE ?', "%#{params["search_text"]}%") 
+0

これは 'last_name'と' nick_name'という名前の列があることを意味しますが、質問には 'name'列が1つしかありません。 – p4sh4

+0

@ p4sh4あなたは正しいです。私はその質問を誤解した。私の答えを更新しました。 –

2

LIKEILIKE、そして最後に%であなただけの開始時に用語に一致している:あなたはこれを試してみてくださいall

+1

.allは必要ありません –

関連する問題