更新日:
【Rails】 ransackを使って検索機能がついたアプリを作ろう!
ransackとは検索機能を実装できるgemです。簡単な検索や複雑な検索のフォームを簡単に作成することができます。
アプリを作っていると検索機能を付けたい時があります。
そんな時に便利なgemがransackです。
ransackを使えば、このような検索機能を簡単に作ることができます。
ransackの使い方
この章では、実際にアプリを作りながらransackの使い方を説明していきます。
サンプルアプリケーションを用意しよう
それでは今回使用するサンプルアプリを作成していきましょう。
ターミナルで下記のコマンドを実行してください。
1
2
$ rails _5.2.1_ new ransack_test -d mysql
$ cd ransack_test
次にscaffoldを使ってユーザー登録機能を実装します。
1
2
$ rails g scaffold User name:string age:integer height:integer weight:integer gender:string
$ rails db:create && rails db:migrate
次にseedファイルを編集し、データベースに初期データを追加します。
1
2
3
4
5
6
7
users = [
{ name: '田中ゆうこ', age: 24, height: 155, weight: 40, gender: '女' },
{ name: '森山太郎', age: 26, height: 167, weight: 60, gender: '男' },
{ name: '山田太郎', age: 34, height: 175, weight: 74, gender: '男' },
{ name: '秋山なお', age: 18, height: 160, weight: 46, gender: '女' }
]
User.create(users)
今回のように複数のレコードを作成したいときはcreateメソッドに配列を渡すと簡潔に書けます。
詳細はcreateメソッドの使い方と似ているメソッドとの違いとは?の記事を参照してください。
次にターミナルで下記のコマンドを実行してください。
1
$ rails db:seed
ransackを導入しよう
それでは次にGemfileにransackを追加しインストールしていきます。
Gemfileの一番下に下記のコードを追記してください。
1
gem 'ransack'
次にbundle installコマンドを実行し、gemをインストールします。
1
$ bundle install
rails sコマンドでサーバーを立ち上げ、http://localhost:3000/usersにアクセスし、下記の画面になっていれば準備完了です。
簡単な検索フォームを作ろう
この章では先ほど作成したサンプルアプリを使って実際に検索フォームを作成していきます。
どのような流れ、記述で検索機能が実装できるかを確認しましょう。
コントローラーを編集しよう
それではコントローラーを編集していきます。
検索をするためのアクションを追加しよう
今回は検索をし、その結果を表示するために新たにsearchアクション
を追加します。
routes.rb
を下記のように編集してください。
1
2
3
4
5
6
7
Rails.application.routes.draw do
resources :users do
collection do
get 'search'
end
end
end
ルーティングに7つのアクション以外を追加するときには今回のようにcollectionを使います。
より詳しい使い方はresourcesメソッドを使ってルーティングを定義しよう!の記事を参照してください。
コントローラーにsearchアクションを定義しよう
次にコントローラーに検索を行うための記述をしていきます。
まずは検索結果を取得するコードはprivate以下にメソッド化して、それをbefore_actionで呼び出します。
そして先ほどルーティングに追加したsearchアクションを定義します。
下のハイライトが当たっている部分のコードをusers_controller.rb
に追記しましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
before_action :set_q, only: [:index, :search]
def index
@users = User.all
end
def show
end
def new
@user = User.new
end
def edit
end
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
def destroy
@user.destroy
respond_to do |format|
format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
format.json { head :no_content }
end
end
def search
@results = @q.result
end
private
def set_q
@q = User.ransack(params[:q])
end
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:name, :age, :height, :weight, :gender)
end
end
上記のコードで使用しているメソッドの概要は以下の通りです。
用語 | 説明 |
---|---|
params[:q] | この後に作成するビューファイルから送られてくるパラメーターです。 |
ransackメソッド | 送られてきたパラメーターを元にテーブルからデータを検索するメソッドです。 (whereメソッドのransack版というイメージです。) |
resultメソッド | ransackメソッドで取得したデータを ActiveRecord_Relationのオブジェクトに変換するメソッドです。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[1] pry(#<UsersController>)> @q
=> Ransack::Search<class: User, base: Grouping <conditions: [Condition <attributes: ["name"], predicate: cont, values: ["田中"]>], combinator: and>>
[2] pry(#<UsersController>)>@results = @q.result
User Load (0.8ms) SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '%田中%'
↳ app/controllers/users_controller.rb:69
=> [#<User:0x00007f8e37ae2190
id: 1,
name: "田中ゆうこ",
age: 24,
height: 155,
weight: 40,
gender: "女",
created_at: XXX, XX Nov 2020 XX:XX:XX UTC +00:00,
updated_at: XXX, XX Nov 2020 XX:XX:XX UTC +00:00>]
# クラスの確認
[3] pry(#<UsersController>)> @results.class
=> User::ActiveRecord_Relation
検索フォームを作成しよう
次にビューファイルを編集していきます。
ユーザーの一覧ページに検索フォームを作成してみましょう。
index.html.erb
の一番下に下記のコードを追記します。
1
2
3
4
5
6
7
<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<br>
<%= f.submit '検索' %>
<% end %>
記述が終了したら、control + c
でサーバーを止めた後、再度rails s
を実行してからhttp://localhost:3000/usersにアクセスしましょう。
下の画像のようになっていれば問題なくコードを追記できています。
search_form_forメソッド
下のコード内でハイライトされている行のsearch_form_forメソッド
がransackで用意されているメソッドです。
form_forやform_withのransack版と思ってください。
1
2
3
4
5
6
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<br>
<%= f.submit '検索' %>
<% end %>
search_form_forメソッド
を使うことで下記のようなhtmlが作成されます。
1
<form class="user_search" id="user_search" action="/users/search" accept-charset="UTF-8" method="get">
_contメソッド
次に下のコードのハイライトされている部分に注目してください。
name_cont
とカラム名の後に_cont
とついています。
この_contメソッド
はransackで用意されている検索したワードが含まれているレコードを取得するためのメソッドです。
1
2
3
4
5
6
7
<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<br>
<%= f.submit '検索' %>
<% end %>
_cont
の他にもたくさんのメソッドがありますが、同じように_
の前に検索したいカラム名を入れます。
今回はnameカラムから検索したいのでname_cont
としました。
name_contの場合は、入力されたワードでnameカラムに対してあいまい検索されていると思ってください。
f.search_fieldメソッド
f.search_field
の部分は文字を入力するフォームであればf.text_fieldでも構いませんし、数値を入力するフォームであればf.number_fieldでも構いません。
ですがf.search_field
で入力フォームを作成すると検索フォームとして作成されます。
検索フォームとはinputタグにtype="search"
が記述されているフォームです。
この記述があることによりフォームの右に「x」ボタンが表示されるようになります。
「x」ボタンをクリックすると入力された内容をリセットすることができます。
検索の条件を変更しよう
検索の条件はname属性を指定することで変えることができます。
例えば完全に一致する検索結果を表示したい場合は_eq
を使います。
この時は検索フォームに入力した値と全て一致しなければ検索結果として表示されません。
ransackには他にも色々な検索ができるメソッドがたくさん用意してあります。
最後に紹介するメソッド一覧の表を参考に、自分が実装したい検索フォームを作ってみましょう。
検索結果を表示してみよう
次に上の画像のような検索結果を表示するsearchアクションのビューファイルを作成します。
app/views/users
フォルダにsearch.html.erb
ファイルを作成しましょう。
作成したら下記のように記述をしてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<h1>検索結果</h1>
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Height</th>
<th>Weight</th>
<th>Gender</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @results.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.age %></td>
<td><%= user.height %></td>
<td><%= user.weight %></td>
<td><%= user.gender %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<%= link_to 'Top', users_path %>
記述が終了したらhttp://localhost:3000/usersにアクセスして挙動を確認してみましょう。
たったこれだけで、簡単な検索フォームを作ることができてます。
より高度な検索フォームを作ろう
ここまで簡単な検索フォームの実装方法を解説してきました。
ここからはより高度な検索フォームを作成するための解説をしていきます。
複数カラムの検索をしよう
今は一つのカラムしか検索できていませんが、年齢や身長などでも検索できるよう、検索の条件を増やしてみます。
実装は簡単です。
検索フォームにフォームを追記するだけです。
ビューファイルを下記のように編集しましょう。
1
2
3
4
5
6
7
8
9
<!-- 略 -->
<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<%= f.label :age_eq, '年齢' %>
<%= f.search_field :age_eq %>
<%= f.submit '検索' %>
<% end %>
このように記述すると名前と年齢で検索をすることができます。
この場合、どちらか一方でも当てはまらない場合は検索結果に表示されず、2つの条件を満たすレコードのみが表示されます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%田中%' AND `users`.`age` = 24)
上の例だと複数のカラムを検索するために入力フォームを複数にしました。
ですが、1つの入力フォームで複数のカラムを検索することもできます。
それがカラム名_or_カラム名_or_カラム名_メソッド
のように_or_
でカラム名を繋ぐ方法です。
1
2
3
4
5
6
7
<!-- 略 -->
<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :age_or_height_or_weight_gt, "数値を入力してください" %>
<%= f.search_field :age_or_height_or_weight_gt %>
<%= f.submit '検索' %>
<% end %>
上のように記述すると年齢(age)、身長(height)、体重(weight)の3つのカラムを同時に検索することができます。
範囲を指定して検索しよう
数値で検索をする場合は範囲で指定できると便利ですね。
その場合は_lteq
や_gteq
を使い、ラジオボタンで選択してもらうようにします。
1
2
3
4
5
6
7
8
9
10
11
# 〜以下の場合
<%= f.radio_button :カラム名_lteq, '検索する数字' %>表示する文字
# 〜未満の場合
<%= f.radio_button :カラム名_lt, '検索する数字' %>表示する文字
# 〜以上の場合
<%= f.radio_button :カラム名_gteq, '検索する数字' %>表示する文字
# 〜より大きい場合
<%= f.radio_button :カラム名_gt, '検索する数字' %>表示する文字
それでは実際にフォームを作成してみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 略 -->
<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<%= f.label :age, '年齢' %>
<%= f.radio_button :age_lteq, '' %>指定しない
<%= f.radio_button :age_lteq, '10' %>10歳以下
<%= f.radio_button :age_lteq, '20' %>20歳以下
<%= f.radio_button :age_lteq, '30' %>30歳以下
<%= f.radio_button :age_lteq, '40' %>40歳以下
<%= f.radio_button :age_gteq, '50' %>50歳以上
<%= f.submit '検索' %>
<% end %>
上のように記述すると下の画像のような検索フォームを作成することができます。
複数の検索フォームを作ろう
複数の条件に当てはまる1つの検索フォームを作成できました。
ですが、同じページで複数の検索フォームを作りたい場合はどうすれば良いでしょうか?
その時は検索フォームを複数定義します。
ビューファイルを下記のように編集してみます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 略 -->
<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<%= f.submit '検索' %>
<% end %>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.radio_button :age_lteq, '' %>指定しない
<%= f.radio_button :age_lteq, '10' %>10歳以下
<%= f.radio_button :age_lteq, '20' %>20歳以下
<%= f.radio_button :age_lteq, '30' %>30歳以下
<%= f.radio_button :age_lteq, '40' %>40歳以下
<%= f.radio_button :age_gteq, '50' %>50歳以上
<%= f.submit '検索' %>
<% end %>
上のように記述すると下の画像のような複数の検索フォームを作ることができます。
ソート機能を実装しよう
ソートとは順番を並び替える機能です。
楽天やamazonなどでは商品の価格を安い順に並べ替えたりできますが、ransackを使うとこのソート機能を簡単に実装することができます。
この章ではソート機能を実装する手順を紹介していきます。
ビューファイルを編集しよう
それでは先ほど作成したアプリにソート機能を実装していきましょう。
実装は非常に簡単で、テーブルのカラム名を変更するだけです。
1
<%= sort_link(@q, :データベースのカラム名, "表示される文字" %>
index.html.erb
のテーブルのカラム名を下記のように編集します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<p id="notice"><%= notice %></p>
<h1>Users</h1>
<table>
<thead>
<tr>
<th><%= sort_link(@q, :name, "Name") %></th>
<th><%= sort_link(@q, :age, "Age") %></th>
<th><%= sort_link(@q, :height, "Height") %></th>
<th><%= sort_link(@q, :weight, "Weight") %></th>
<th><%= sort_link(@q, :gender, "Gender") %></th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @results.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.age %></td>
<td><%= user.height %></td>
<td><%= user.weight %></td>
<td><%= user.gender %></td>
<td><%= link_to 'Show', user %></td>
<td><%= link_to 'Edit', edit_user_path(user) %></td>
<td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New User', new_user_path %>
<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<%= f.submit '検索' %>
<% end %>
同じように検索結果のテーブルも変更します。
1
2
3
4
5
6
7
8
9
10
11
12
<h1>検索結果</h1>
<table>
<thead>
<tr>
<th><%= sort_link(@q, :name, "Name") %></th>
<th><%= sort_link(@q, :age, "Age") %></th>
<th><%= sort_link(@q, :height, "Height") %></th>
<th><%= sort_link(@q, :weight, "Weight") %></th>
<th><%= sort_link(@q, :gender, "Gender") %></th>
<th colspan="3"></th>
</tr>
</thead>
今の状態だと検索結果のテーブルではソートされますが、最初のページではソートがされません。
indexアクションを下記のように編集します。
1
2
3
def index
@users = @q.result
end
これでソート機能が実装されました。
初期の順番をかえてみよう
現在だと先程の画像のように最初は昇順(数字が低い順)で並び替えが行われます。
ransackではオプションを指定することでカラムごとに最初にソートされる順番を変えることができます。
1
<%= sort_link(@q, :データベースのカラム名, "表示される文字", default_order: :desc %>
上のようにdefault_order: :desc
と記述すると昇順から降順に変更することができます。
表示される▲、▼を非表示にしよう
ソートのリンクをクリックするとカラム名の右に▲、▼が表示されるようになります。
デザインが崩れて見栄えが悪くなるときは非表示にすることもできます。
1
<%= sort_link(@q, :データベースのカラム名, "表示される文字", hide_indicator: true) %>
上のようにhide_indicator: true
と記述すると非表示になります。
便利なメソッドを使おう
先ほどの例で紹介した以外にもransackには検索に便利なメソッドがたくさん用意されています。
これらのメソッドを使い分けることで様々な検索フォームを作成することができます。
*の部分には検索したいカラム名が入ります。
メソッド名 | 説明 |
---|---|
*_eq | 完全に一致するとき |
*_not_eq | 完全に一致しないとき |
*_matches | 一部が一致するとき |
*_does_not_match | 一部が一致しないとき |
*_matches_any | いずれかに一致するとき |
*_matches_all | 全てに一致するとき |
*_does_not_match_any | いずれにも一致しないとき |
*_does_not_match_all | 全てに一致しないとき |
*_lt | 〜未満のとき |
*_lteq | 〜以下のとき |
*_gt | 〜より大きいとき |
*_gteq | 〜以上のとき |
*_present | nullでも空でもないとき |
*_blank | nullまたは空のとき |
*_null | nullのとき |
*_not_null | nullではないとき |
*_in | 配列内の値と一致するとき |
*_not_in | 配列内のどの値とも一致しないとき |
*_lt_any | いずれかの値より少ないとき |
*_lteq_any | いずれかの値以下のとき |
*_gt_any | いずれかの値より大きいとき |
*_gteq_any | いずれかの値以上のとき |
*_lt_all | 全ての値より少ないとき |
*_lteq_all | 全ての値以下のとき |
*_gt_all | 全ての値より大きいとき |
*_gteq_all | 全ての値以上のとき |
*_not_eq_all | 指定した値ではないとき |
*_start | 前方一致のとき |
*_not_start | 前方不一致のとき |
*_start_any | 〜のいずれかで始まるとき |
*_start_all | 〜の全てから始まるとき |
*_not_start_any | 〜のいずれかで始まらないとき |
*_not_start_all | 〜の全てから始まらないとき |
*_end | 後方一致のとき |
*_not_end | 後方不一致のとき |
*_end_any | 〜のいずれかで終わるとき |
*_end_all | 〜の全てで終わるとき |
*_not_end_any | 〜のいずれかで終わらないとき |
*_not_end_all | 〜の全てで終わらないとき |
*_cont | 〜の部分が一致するとき |
*_cont_any | 〜のいずれかが含まれているとき |
*_cont_all | 〜の全てが含まれているとき |
*_not_cont | 〜に部分が一致しないとき |
*_not_cont_any | 〜のいずれかが含まれないとき |
*_not_cont_all | 〜の全てが含まれないとき |
*_i_cont | 大文字と小文字を区別しない値が含まれるとき |
*_i_cont_any | 大文字と小文字を区別しないいずれかの値が含まれるとき |
*_i_cont_all | 大文字と小文字を区別しない全ての値が含まれるとき |
*_not_i_cont | 大文字と小文字を区別しない値が含まれないとき |
*_not_i_cont_any | 大文字と小文字を区別しないいずれかの値が含まれないとき |
*_not_i_cont_all | 大文字と小文字を区別しない全ての値が含まれないとき |
*_true | 真偽値のレコードを取得するとき |
*_false | 真偽値と反対のレコードを取得するとき |
メソッドの使い方を確認しよう
このようにたくさんのメソッドがありますが、実施にどういうときに使うのか、またどのように記述するかを確認していきます。
*_eq
=検索
を行います。
検索ワードと完全に一致するレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_eq, 'ユーザー名' %>
<%= f.search_field :name_eq %>
<%= f.submit '検索' %>
<% end %>
完全に一致するレコードを検索するので、上の例のように「太郎」だけだと検索にヒットしません。
1
SELECT `users`.* FROM `users` WHERE `users`.`name` = '山田太郎'
*_not_eq
!=検索
を行います。
検索ワードと完全に一致しないレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_not_eq, 'ユーザー名' %>
<%= f.search_field :name_not_eq %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` != '山田太郎'
*_matches
LIKE検索
を行います。
検索ワードと条件が一致するレコードを検索します。
検索ワードには「山田%」や「山_」のように%
や_
を入れます。
%
は空白文字を含む任意の文字列を表します。
「山田%」とすれば前方に「山田」がつくワードがあるレコードを検索します。
「%太郎」とすれば後方に「太郎」がつくワードがあるレコードを検索します。
「%山%」とすると文字の中に「山」が入るレコードを検索します。
_
は任意の1文字を表します。
「山_」とすると先頭に「山」がついた2文字を検索します。
「山田太郎」を結果として取得したい場合は「山___」という風に_
を3つ記述します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_matches, 'ユーザー名' %>
<%= f.search_field :name_matches %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '山田%'
メールアドレスを検索するときに「%@gmail.com」のようなワードで検索するとgmailのメールアドレスだけ取得できたりするので便利です。
*_does_not_match
NOT LIKE検索
を行います。
検索ワードと一部が一致しないレコードを検索します。
検索ワードの指定方法は*_matches
と同じです。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_does_not_match, 'ユーザー名' %>
<%= f.search_field :name_does_not_match %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '山田%'
*_matches_any
LIKE検索のOR検索
を行います。
検索ワードと一部が一致するレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
検索ワードの指定方法は*_matches
と同じです。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_matches_any][]" %>
<%= search_field_tag "q[name_matches_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと文字の中に「中」が入っているか、末尾に「太郎」が付いているレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%中%' OR `users`.`name` LIKE '%太郎')
*_matches_all
LIKE検索のAND検索
を行います。
検索ワードと一部が一致するレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
検索ワードの指定方法は*_matches
と同じです。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_matches_all][]" %>
<%= search_field_tag "q[name_matches_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと文字の中に「田」が入っていて、末尾に「太郎」が付いているレコードを取得します。
「田中ゆうこ」は「田」が入っていますが、末尾に「太郎」が付いていないので取得されません。
「森山太郎」は末尾に「太郎」が付いていますが、「田」が入っていないので取得されません。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%田%' AND `users`.`name` LIKE '%太郎')
*_does_not_match_any
NOT LIKE検索のOR検索
を行います。
検索ワードと一部が一致しないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
検索ワードの指定方法は*_matches
と同じです。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_does_not_match_any][]" %>
<%= search_field_tag "q[name_does_not_match_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと文字の中に「田」が入っていないか、末尾に「太郎」が付いていないレコードを取得します。
「田中ゆうこ」は「田」が入っていますが、末尾に「太郎」がついていないので取得されます。
「山田太朗」は「田」が入っていて、末尾に「太朗」もついているので取得されません。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%田%' OR `users`.`name` NOT LIKE '%太郎')
*_does_not_match_all
NOT LIKE検索のAND検索
を行います。
検索ワードと一部が一致しないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
検索ワードの指定方法は*_matches
と同じです。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_does_not_match_all][]" %>
<%= search_field_tag "q[name_does_not_match_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと文字の中に「田」が入っていなくて、末尾に「太郎」が付いていないレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%田%' AND `users`.`name` NOT LIKE '%太郎')
*_lt
<検索
を行います。
検索ワードで入力された数値未満のレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :age_lt, '年齢' %>
<%= f.search_field :age_lt %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`age` < 26
*_lteq
<=検索
を行います。
検索ワードで入力された数値以下のレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :age_lteq, '年齢' %>
<%= f.search_field :age_lteq %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`age` <= 26
*_gt
>検索
を行います。
検索ワードで入力された数値より大きいレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :age_gt, '年齢' %>
<%= f.search_field :age_gt %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`age` > 26
*_gteq
>=検索
を行います。
検索ワードで入力された数値以上のレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :age_gteq, '年齢' %>
<%= f.search_field :age_gteq %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`age` >= 26
*_present
NULLまたは空文字以外の検索を行います。
検索フォームにはtrue
、false
を入力します。
true
の場合、NULLまたは空文字以外のレコードを検索します。
false
の場合はNULLまたは空文字のレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_present, 'ユーザー名' %>
<%= f.search_field :name_present %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` IS NOT NULL AND `users`.`name` != '')
*_blank
NULLまたは空文字の検索を行います。
検索フォームにはtrue
、false
を入力します。
true
の場合はNULLまたは空文字のレコードを検索します。
false
の場合、NULLまたは空文字以外のレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_blank, 'ユーザー名' %>
<%= f.search_field :name_blank %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` IS NULL OR `users`.`name` = '')
*_null
NULLの検索を行います。
検索フォームにはtrue
、false
を入力します。
true
の場合はNULLのレコードを検索します。
false
の場合、NULL以外のレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_null, 'ユーザー名' %>
<%= f.search_field :name_null %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` IS NULL
*_not_null
NULLではない検索を行います。
検索フォームにはtrue
、false
を入力します。
true
の場合はNULL以外のレコードを検索します。
false
の場合、NULLのレコードを検索します。
1
2
3
4
5
6
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_not_null, 'ユーザー名' %>
<%= f.search_field :name_not_null %>
<br>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` IS NOT NULL
*_in
IN検索
を行います。
条件の値に完全に一致する検索を同時に行います。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_in][]" %>
<%= search_field_tag "q[name_in][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例のように「田中ゆうこ」か「山田太郎」という検索ワードに完全に一致するレコードを検索します。
1
SELECT `users`.* FROM `users` WHERE `users`.`name` IN ('田中ゆうこ', '山田太郎')
*_not_in
NOT IN検索
を行います。
条件の値に完全に一致しない検索を同時に行います。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_in][]" %>
<%= search_field_tag "q[name_not_in][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例のように「田中ゆうこ」か「山田太郎」という検索ワードに完全に一致しないレコードを検索します。
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT IN ('田中ゆうこ', '山田太郎')
*_lt_any
<検索のOR検索
を行います。
検索ワードで入力された数値未満のレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_lt_any][]" %>
<%= search_field_tag "q[age_lt_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例のように「20」もしくは「26」未満のレコードを検索します。
検索結果の「24」と「18」はどちらかの条件を満たしているのがわかります。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` < 20 OR `users`.`age` < 26)
*_lteq_any
<=検索のOR検索
を行います。
検索ワードで入力された数値以下のレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_lteq_any][]" %>
<%= search_field_tag "q[age__lteq_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` <= 20 OR `users`.`age` <= 26)
*_gt_any
>検索のOR検索
を行います。
検索ワードで入力された数値より大きいレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_gt_any][]" %>
<%= search_field_tag "q[age_gt_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` > 24 OR `users`.`age` > 30)
*_gteq_any
>=検索のOR検索
を行います。
検索ワードで入力された数値より大きいレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_gteq_any][]" %>
<%= search_field_tag "q[age_gteq_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` >= 24 OR `users`.`age` >= 30)
*_lt_all
<検索のAND検索
を行います。
検索ワードで入力された数値未満のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_lt_all][]" %>
<%= search_field_tag "q[age_lt_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` < 24 AND `users`.`age` < 30)
上の例のように「24」未満であり「30」未満でもあるレコードを検索します。
検索結果の「18」はどちらの条件も満たしているのがわかります。
*_lteq_all
<=検索のAND検索
を行います。
検索ワードで入力された数値以下のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_lteq_all][]" %>
<%= search_field_tag "q[age_lteq_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` <= 24 AND `users`.`age` <= 30)
*_gt_all
>検索のAND検索
を行います。
検索ワードで入力された数値より大きいレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_gt_all][]" %>
<%= search_field_tag "q[age_gt_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` > 24 AND `users`.`age` > 30)
*_gteq_all
<=検索のAND検索
を行います。
検索ワードで入力された数値以上のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_gteq_all][]" %>
<%= search_field_tag "q[age_gteq_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` >= 24 AND `users`.`age` >= 34)
*_not_eq_all
!=検索のAND検索
を行います。
検索ワードで入力された数値以外のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[age_not_eq_all][]" %>
<%= search_field_tag "q[age_not_eq_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` != 24 AND `users`.`age` != 34)
*_start
前方一致のLIKE検索
を行います。
検索ワードで入力された文字が先頭につくレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_start, 'ユーザー名' %>
<%= f.search_field :name_start %>
<%= f.submit '検索' %>
<% end %>
上の例だと先頭に「森」という文字がついたレコードを全て取得します。
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '森%'
*_not_start
前方不一致のNOT LIKE検索
を行います。
検索ワードで入力された文字が先頭につかないレコードを検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_not_start, 'ユーザー名' %>
<%= f.search_field :name_not_start %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '森%'
*_start_any
前方一致のLIKE検索のOR検索
を行います。
検索ワードで入力された文字が先頭につくレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_start_any][]" %>
<%= search_field_tag "q[name_start_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと先頭に「森」か「山」がつくレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '森%' OR `users`.`name` LIKE '山%')
*_start_all
前方一致のLIKE検索のAND検索
を行います。
検索ワードで入力された文字が先頭につくレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_start_all][]" %>
<%= search_field_tag "q[name_start_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと先頭が「森」と「森山」両方を満たすレコードを取得します。
「森田」は先頭に「森」がつく条件は満たしていますが、「森山」がつく条件を満たしていないため取得されません。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '森%' AND `users`.`name` LIKE '森山%')
*_not_start_any
前方不一致のNOT LIKE検索のOR検索
を行います。
検索ワードで入力された文字が先頭につかないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_start_any][]" %>
<%= search_field_tag "q[name_not_start_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと先頭に「森」と「森山」がつかないレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '森%' OR `users`.`name` NOT LIKE '森山%')
*_not_start_all
前方不一致のNOT LIKE検索のAND検索
を行います。
検索ワードで入力された文字が先頭につかないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_start_all][]" %>
<%= search_field_tag "q[name_not_start_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '森%' AND `users`.`name` NOT LIKE '山%')
*_end
後方一致のLIKE検索
を行います。
検索ワードで入力された文字が末尾につくレコードを取得します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_end, 'ユーザー名' %>
<%= f.search_field :name_end %>
<%= f.submit '検索' %>
<% end %>
上の例だと末尾に「太郎」がつくレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '%太郎'
*_not_end
後方不一致のNOT LIKE検索
を行います。
検索ワードで入力された文字が末尾につかないレコードを取得します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_not_end, 'ユーザー名' %>
<%= f.search_field :name_not_end %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '%太郎'
*_end_any
後方一致のLIKE検索のOR検索
を行います。
検索ワードで入力された文字が末尾につくレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_end_any][]" %>
<%= search_field_tag "q[name_end_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%ゆうこ' OR `users`.`name` LIKE '%なお')
*_end_all
後方一致のLIKE検索のAND検索
を行います。
検索ワードで入力された文字が末尾につくレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_end_all][]" %>
<%= search_field_tag "q[name_end_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%郎' AND `users`.`name` LIKE '%太郎')
*_not_end_any
後方不一致のNOT LIKE検索のOR検索
を行います。
検索ワードで入力された文字が末尾につかないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_end_any][]" %>
<%= search_field_tag "q[name_not_end_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%郎' OR `users`.`name` NOT LIKE '%太郎')
*_not_end_all
後方不一致のNOT LIKE検索のAND検索
を行います。
検索ワードで入力された文字が末尾につかないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_end_all][]" %>
<%= search_field_tag "q[name_not_end_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%ゆうこ' AND `users`.`name` NOT LIKE '%なお')
*_cont
LIKE検索
を行います。
検索ワードで入力された文字が含まれるレコードを取得します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_cont, 'ユーザー名' %>
<%= f.search_field :name_cont %>
<%= f.submit '検索' %>
<% end %>
上の例だと文字の中に「田」が含まれるレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '%田%'
*_cont_any
LIKE検索のOR検索
を行います。
検索ワードで入力された文字が含まれるレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_cont_any][]" %>
<%= search_field_tag "q[name_cont_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと文字の中に「森」か「中」が含まれるレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%森%' OR `users`.`name` LIKE '%中%')
*_cont_all
LIKE検索のAND検索
を行います。
検索ワードで入力された文字が含まれるレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_cont_all][]" %>
<%= search_field_tag "q[name_cont_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと文字の中に「森」と「田」の両方が含まれるレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%森%' AND `users`.`name` LIKE '%田%')
*_not_cont
NOT LIKE検索
を行います。
検索ワードで入力された文字が含まれないレコードを取得します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_not_cont, 'ユーザー名' %>
<%= f.search_field :name_not_cont %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '%田%'
*_not_cont_any
NOT LIKE検索のOR検索
を行います。
検索ワードで入力された文字が含まれないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_cont_any][]" %>
<%= search_field_tag "q[name_not_cont_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと「森」が含まれないレコード、または「田」が含まれないレコードが取得されます。
「田中ゆうこ」だと森が含まれていないため取得されます。
「森山太郎」だと「田」が含まれていないため取得されます。
「森田健作」だと「森」が含まれていないという条件と「田」が含まれていないというどちらの条件も満たしているため取得されません。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%森%' OR `users`.`name` NOT LIKE '%田%')
*_not_cont_all
NOT LIKE検索のAND検索
を行います。
検索ワードで入力された文字が含まれないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_cont_all][]" %>
<%= search_field_tag "q[name_not_cont_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
上の例だと「森」という文字と「田」という文字両方が含まれていないレコードを取得します。
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%森%' AND `users`.`name` NOT LIKE '%田%')
*_i_cont
LOWERのLIKE検索
を行います。
検索ワードで入力された文字が含まれるレコードを大文字と小文字を区別しないで検索します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_i_cont, 'ユーザー名' %>
<%= f.search_field :name_i_cont %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE LOWER(`users`.`name`) LIKE '%tanaka%'
*_i_cont_any
LOWERのLIKE検索のOR検索
を行います。
検索ワードで入力された文字が含まれるレコードを大文字と小文字を区別せず複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_i_cont_any][]" %>
<%= search_field_tag "q[name_i_cont_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (LOWER(`users`.`name`) LIKE '%ta%' OR LOWER(`users`.`name`) LIKE '%mo%')
*_i_cont_all
LOWERのLIKE検索のAND検索
を行います。
検索ワードで入力された文字が含まれるレコードを大文字と小文字を区別せず複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_i_cont_all][]" %>
<%= search_field_tag "q[name_i_cont_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (LOWER(`users`.`name`) LIKE '%ta%' AND LOWER(`users`.`name`) LIKE '%mo%')
*_not_i_cont
LOWERのNOT LIKE検索
を行います。
検索ワードで入力された文字が含まれないレコードを大文字と小文字を区別しないで取得します。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :name_not_i_cont, 'ユーザー名' %>
<%= f.search_field :name_not_i_cont %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE LOWER(`users`.`name`) NOT LIKE '%ta%'
*_not_i_cont_any
LOWERのNOT LIKE検索のOR検索
を行います。
検索ワードで入力された文字が含まれないレコードを大文字と小文字を区別せず複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_i_cont_any][]" %>
<%= search_field_tag "q[name_not_i_cont_any][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (LOWER(`users`.`name`) NOT LIKE '%mo%' OR LOWER(`users`.`name`) NOT LIKE '%ta%')
*_not_i_cont_all
LOWERのNOT LIKE検索のAND検索
を行います。
検索ワードで入力された文字が含まれないレコードを大文字と小文字を区別せず複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= search_field_tag "q[name_not_i_cont_all][]" %>
<%= search_field_tag "q[name_not_i_cont_all][]" %>
<%= f.submit '検索' %>
<% end %>
フォームで入力されたワードは配列で送られるので、上のようにname属性の末尾に[]
をつける必要があります。
フォームは何個でも増やすことができます。
1
SELECT `users`.* FROM `users` WHERE (LOWER(`users`.`name`) NOT LIKE '%mo%' AND LOWER(`users`.`name`) NOT LIKE '%ta%')
*_true
真偽値を判定する検索
を行います。
検索ワードに入力した値がtrueの場合にtrueのレコードを、falseの場合にfalseのレコードを取得します。
SQLでは数字の1
や文字列、true
の文字がTRUE
を、0
やfalse
の文字をFALSE
とみなします。
※数値の場合0
以外は1
と判定されます。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :gender_true, '性別' %>
<%= f.search_field :gender_true %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`gender` = TRUE
*_false
真偽値を判定する検索
を行います。
検索ワードに入力した値がtrueの場合にfalseのレコードを、falseの場合にtrueのレコードを取得します。
SQLでは数字の1
や文字列、true
の文字がTRUE
を、0
やfalse
の文字をFALSE
とみなします。
※数値の場合0
以外は1
と判定されます。
1
2
3
4
5
<%= search_form_for @q, url: search_users_path do |f| %>
<%= f.label :gender_false, '性別' %>
<%= f.search_field :gender_false %>
<%= f.submit '検索' %>
<% end %>
1
SELECT `users`.* FROM `users` WHERE `users`.`gender` != FALSE
このようにransackでは条件を指定できるメソッドが豊富に用意されています。
ぜひこれらのメソッドを使い分けて使いやすい検索フォームを作成してみてください。
この記事のまとめ
- ransackは検索機能を簡単に実装できるgemです
- ransackで用意されているメソッドを使うことにより、色々な条件の検索フォームを簡単に作成できます
- 並び替えができるソート機能も簡単に実装することができます