すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】ransackを使って検索機能がついたアプリを作ろう!

ぴっかちゃん
ぴっかちゃん

ransackとは検索機能を実装できるgemです。簡単な検索や複雑な検索のフォームを簡単に作成することができます。

アプリを作っていると検索機能を付けたい時があります。
そんな時に便利なgemがransackです。

検索結果

ransackを使えば、このような検索機能を簡単に作ることができます。

ransackの使い方

この章では、実際にアプリを作りながらransackの使い方を説明していきます。

サンプルアプリケーションを用意しよう

それでは今回使用するサンプルアプリを作成していきましょう。
ターミナルで下記のコマンドを実行してください。

ターミナル | 新規アプリの作成
1
2
$ rails _5.2.1_ new ransack_test -d mysql
$ cd ransack_test

次にscaffoldを使ってユーザー登録機能を実装します。

ターミナル | scaffoldでユーザー登録機能を作成
1
2
$ rails g scaffold User name:string age:integer height:integer weight:integer gender:string
$ rails db:create && rails db:migrate

次にseedファイルを編集し、データベースに初期データを追加します。

db/seeds.rb | 初期データの登録
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メソッドの使い方と似ているメソッドとの違いとは?の記事を参照してください。

次にターミナルで下記のコマンドを実行してください。

ターミナル | seed.rbの実行
1
$ rails db:seed

ransackを導入しよう

それでは次にGemfileにransackを追加しインストールしていきます。
Gemfileの一番下に下記のコードを追記してください。

Gemfile | gemの追加
1
gem 'ransack'

次にbundle installコマンドを実行し、gemをインストールします。

ターミナル | gemのインストール
1
$ bundle install

rails sコマンドでサーバーを立ち上げ、http://localhost:3000/usersにアクセスし、下記の画面になっていれば準備完了です。

ユーザー一覧ページ

簡単な検索フォームを作ろう

この章では先ほど作成したサンプルアプリを使って実際に検索フォームを作成していきます。
どのような流れ、記述で検索機能が実装できるかを確認しましょう。

コントローラーを編集しよう

それではコントローラーを編集していきます。

検索をするためのアクションを追加しよう

今回は検索をし、その結果を表示するために新たにsearchアクションを追加します。
routes.rbを下記のように編集してください。

config/routes.rb | searchアクションのルーティングの追加
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に追記しましょう。

app/controllers/users_controller.rb | searchアクションの定義
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一番下に下記のコードを追記します。

app/views/users/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_forform_withのransack版と思ってください。

index.html.erb | search_form_for
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が作成されます。

index.html | コンパイルされるコード
1
<form class="user_search" id="user_search" action="/users/search" accept-charset="UTF-8" method="get">

_contメソッド

次に下のコードのハイライトされている部分に注目してください。
name_contとカラム名の後に_contとついています。
この_contメソッドはransackで用意されている検索したワードが含まれているレコードを取得するためのメソッドです。

app/views/users/index.html.erb | _contメソッド
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」ボタンをクリックすると入力された内容をリセットすることができます。

searc_field

検索の条件を変更しよう

検索の条件はname属性を指定することで変えることができます。
例えば完全に一致する検索結果を表示したい場合は_eqを使います。
この時は検索フォームに入力した値と全て一致しなければ検索結果として表示されません。

完全一致の検索

ransackには他にも色々な検索ができるメソッドがたくさん用意してあります。
最後に紹介するメソッド一覧の表を参考に、自分が実装したい検索フォームを作ってみましょう。

検索結果を表示してみよう

次に上の画像のような検索結果を表示するsearchアクションのビューファイルを作成します。
app/views/usersフォルダにsearch.html.erbファイルを作成しましょう。
作成したら下記のように記述をしてください。

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にアクセスして挙動を確認してみましょう。
たったこれだけで、簡単な検索フォームを作ることができてます。

検索結果

より高度な検索フォームを作ろう

ここまで簡単な検索フォームの実装方法を解説してきました。
ここからはより高度な検索フォームを作成するための解説をしていきます。

複数カラムの検索をしよう

今は一つのカラムしか検索できていませんが、年齢や身長などでも検索できるよう、検索の条件を増やしてみます。

実装は簡単です。
検索フォームにフォームを追記するだけです。
ビューファイルを下記のように編集しましょう。

app/views/users/index.html.erb | 検索フォームの作成
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つの条件を満たすレコードのみが表示されます。

検索結果

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%田中%' AND `users`.`age` = 24)

上の例だと複数のカラムを検索するために入力フォームを複数にしました。
ですが、1つの入力フォームで複数のカラムを検索することもできます。
それがカラム名_or_カラム名_or_カラム名_メソッドのように_or_でカラム名を繋ぐ方法です。

app/views/users/index.html.erb | 検索フォームの作成
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つのカラムを同時に検索することができます。

_or_

範囲を指定して検索しよう

数値で検索をする場合は範囲で指定できると便利ですね。
その場合は_lteqgteqを使い、ラジオボタンで選択してもらうようにします。

app/views/users/index.html.erb | 検索フォームの作成
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つの検索フォームを作成できました。
ですが、同じページで複数の検索フォームを作りたい場合はどうすれば良いでしょうか?

その時は検索フォームを複数定義します。
ビューファイルを下記のように編集してみます。

app/views/users/index.html.erb | 検索フォームの作成
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のテーブルのカラム名を下記のように編集します。

app/views/users/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 %>

同じように検索結果のテーブルも変更します。

app/views/users/search.html.erb | カラム名の編集
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アクションを下記のように編集します。

app/controllers/users_controller.rb | 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

=検索を行います。
検索ワードと完全に一致するレコードを検索します。

ビューファイル | *_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 %>

*_eq

完全に一致するレコードを検索するので、上の例のように「太郎」だけだと検索にヒットしません。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` = '山田太郎'

*_not_eq

!=検索を行います。
検索ワードと完全に一致しないレコードを検索します。

ビューファイル | *_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 %>

*_not_eq

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` != '山田太郎'

*_matches

LIKE検索を行います。
検索ワードと条件が一致するレコードを検索します。

検索ワードには「山田%」や「山_」のように%_を入れます。
%は空白文字を含む任意の文字列を表します。
「山田%」とすれば前方に「山田」がつくワードがあるレコードを検索します。
「%太郎」とすれば後方に「太郎」がつくワードがあるレコードを検索します。
「%山%」とすると文字の中に「山」が入るレコードを検索します。

_は任意の1文字を表します。
「山_」とすると先頭に「山」がついた2文字を検索します。
「山田太郎」を結果として取得したい場合は「山___」という風に_を3つ記述します。

ビューファイル | *_matches
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 %>

_matches

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '山田%'

メールアドレスを検索するときに「%@gmail.com」のようなワードで検索するとgmailのメールアドレスだけ取得できたりするので便利です。

*_does_not_match

NOT LIKE検索を行います。
検索ワードと一部が一致しないレコードを検索します。
検索ワードの指定方法は*_matchesと同じです。

ビューファイル | *_does_not_match
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 %>

*_does_not_match

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '山田%'

*_matches_any

LIKE検索のOR検索を行います。
検索ワードと一部が一致するレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。

検索ワードの指定方法は*_matchesと同じです。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_matches_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

matches_any

上の例だと文字の中に「中」が入っているか、末尾に「太郎」が付いているレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%中%' OR `users`.`name` LIKE '%太郎')

*_matches_all

LIKE検索のAND検索を行います。
検索ワードと一部が一致するレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。

検索ワードの指定方法は*_matchesと同じです。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_matches_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

matches_all

上の例だと文字の中に「田」が入っていて、末尾に「太郎」が付いているレコードを取得します。
「田中ゆうこ」は「田」が入っていますが、末尾に「太郎」が付いていないので取得されません。
「森山太郎」は末尾に「太郎」が付いていますが、「田」が入っていないので取得されません。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%田%' AND `users`.`name` LIKE '%太郎')

*_does_not_match_any

NOT LIKE検索のOR検索を行います。
検索ワードと一部が一致しないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。

検索ワードの指定方法は*_matchesと同じです。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_does_not_match_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

_does_not_match_any

上の例だと文字の中に「田」が入っていないか、末尾に「太郎」が付いていないレコードを取得します。
「田中ゆうこ」は「田」が入っていますが、末尾に「太郎」がついていないので取得されます。
「山田太朗」は「田」が入っていて、末尾に「太朗」もついているので取得されません。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%田%' OR `users`.`name` NOT LIKE '%太郎')

*_does_not_match_all

NOT LIKE検索のAND検索を行います。
検索ワードと一部が一致しないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。

検索ワードの指定方法は*_matchesと同じです。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_does_not_match_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

_does_not_match_all

上の例だと文字の中に「田」が入っていなくて、末尾に「太郎」が付いていないレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%田%' AND `users`.`name` NOT LIKE '%太郎')

*_lt

<検索を行います。
検索ワードで入力された数値未満のレコードを検索します。

ビューファイル | *_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 %>

_lt

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`age` < 26

*_lteq

<=検索を行います。
検索ワードで入力された数値以下のレコードを検索します。

ビューファイル | *_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 %>

lteq

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`age` <= 26

*_gt

>検索を行います。
検索ワードで入力された数値より大きいレコードを検索します。

ビューファイル | *_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 %>

_gt

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`age` > 26

*_gteq

>=検索を行います。
検索ワードで入力された数値以上のレコードを検索します。

ビューファイル | *_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 %>

_gteq

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`age` >= 26

*_present

NULLまたは空文字以外の検索を行います。
検索フォームにはtruefalseを入力します。
trueの場合、NULLまたは空文字以外のレコードを検索します。
falseの場合はNULLまたは空文字のレコードを検索します。

ビューファイル | *_present
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 %>

present

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` IS NOT NULL AND `users`.`name` != '')

*_blank

NULLまたは空文字の検索を行います。
検索フォームにはtruefalseを入力します。
trueの場合はNULLまたは空文字のレコードを検索します。
falseの場合、NULLまたは空文字以外のレコードを検索します。

ビューファイル | *_blank
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 %>

_blank

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` IS NULL OR `users`.`name` = '')

*_null

NULLの検索を行います。
検索フォームにはtruefalseを入力します。
trueの場合はNULLのレコードを検索します。
falseの場合、NULL以外のレコードを検索します。

ビューファイル | *_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 %>

_null

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` IS NULL

*_not_null

NULLではない検索を行います。
検索フォームにはtruefalseを入力します。
trueの場合はNULL以外のレコードを検索します。
falseの場合、NULLのレコードを検索します。

ビューファイル | *_not_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 %>

_not_null

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` IS NOT NULL

*_in

IN検索を行います。
条件の値に完全に一致する検索を同時に行います。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_in
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

_in

上の例のように「田中ゆうこ」か「山田太郎」という検索ワードに完全に一致するレコードを検索します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` IN ('田中ゆうこ', '山田太郎')

*_not_in

NOT IN検索を行います。
条件の値に完全に一致しない検索を同時に行います。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_in
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_in

上の例のように「田中ゆうこ」か「山田太郎」という検索ワードに完全に一致しないレコードを検索します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT IN ('田中ゆうこ', '山田太郎')

*_lt_any

<検索のOR検索を行います。
検索ワードで入力された数値未満のレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_lt_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

lt_any

上の例のように「20」もしくは「26」未満のレコードを検索します。
検索結果の「24」と「18」はどちらかの条件を満たしているのがわかります。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` < 20 OR `users`.`age` < 26)

*_lteq_any

<=検索のOR検索を行います。
検索ワードで入力された数値以下のレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_lteq_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

lteq_any

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` <= 20 OR `users`.`age` <= 26)

*_gt_any

>検索のOR検索を行います。
検索ワードで入力された数値より大きいレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_gt_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

gt_any

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` > 24 OR `users`.`age` > 30)

*_gteq_any

>=検索のOR検索を行います。
検索ワードで入力された数値より大きいレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_gteq_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

gteq_any

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` >= 24 OR `users`.`age` >= 30)

*_lt_all

<検索のAND検索を行います。
検索ワードで入力された数値未満のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_lt_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

lt_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` < 24 AND `users`.`age` < 30)

上の例のように「24」未満であり「30」未満でもあるレコードを検索します。
検索結果の「18」はどちらの条件も満たしているのがわかります。

*_lteq_all

<=検索のAND検索を行います。
検索ワードで入力された数値以下のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_lteq_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

lteq_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` <= 24 AND `users`.`age` <= 30)

*_gt_all

>検索のAND検索を行います。
検索ワードで入力された数値より大きいレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_gt_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

gt_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` > 24 AND `users`.`age` > 30)

*_gteq_all

<=検索のAND検索を行います。
検索ワードで入力された数値以上のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_gteq_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

gteq_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` >= 24 AND `users`.`age` >= 34)

*_not_eq_all

!=検索のAND検索を行います。
検索ワードで入力された数値以外のレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_eq_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

_not_eq_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`age` != 24 AND `users`.`age` != 34)

*_start

前方一致のLIKE検索を行います。
検索ワードで入力された文字が先頭につくレコードを検索します。

ビューファイル | *_start
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 %>

_start

上の例だと先頭に「森」という文字がついたレコードを全て取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '森%'

*_not_start

前方不一致のNOT LIKE検索を行います。
検索ワードで入力された文字が先頭につかないレコードを検索します。

ビューファイル | *_not_start
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 %>

not_start

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '森%'

*_start_any

前方一致のLIKE検索のOR検索を行います。
検索ワードで入力された文字が先頭につくレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_start_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

start_any

上の例だと先頭に「森」か「山」がつくレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '森%' OR `users`.`name` LIKE '山%')

*_start_all

前方一致のLIKE検索のAND検索を行います。
検索ワードで入力された文字が先頭につくレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_start_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

start_all

上の例だと先頭が「森」と「森山」両方を満たすレコードを取得します。
「森田」は先頭に「森」がつく条件は満たしていますが、「森山」がつく条件を満たしていないため取得されません。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '森%' AND `users`.`name` LIKE '森山%')

*_not_start_any

前方不一致のNOT LIKE検索のOR検索を行います。
検索ワードで入力された文字が先頭につかないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_start_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_start_any

上の例だと先頭に「森」と「森山」がつかないレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '森%' OR `users`.`name` NOT LIKE '森山%')

*_not_start_all

前方不一致のNOT LIKE検索のAND検索を行います。
検索ワードで入力された文字が先頭につかないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_start_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_start_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '森%' AND `users`.`name` NOT LIKE '山%')

*_end

後方一致のLIKE検索を行います。
検索ワードで入力された文字が末尾につくレコードを取得します。

ビューファイル | *_end
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 %>

end

上の例だと末尾に「太郎」がつくレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '%太郎'

*_not_end

後方不一致のNOT LIKE検索を行います。
検索ワードで入力された文字が末尾につかないレコードを取得します。

ビューファイル | *_not_end
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 %>

not_end

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '%太郎'

*_end_any

後方一致のLIKE検索のOR検索を行います。
検索ワードで入力された文字が末尾につくレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_end_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

end_any

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%ゆうこ' OR `users`.`name` LIKE '%なお')

*_end_all

後方一致のLIKE検索のAND検索を行います。
検索ワードで入力された文字が末尾につくレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_end_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

end_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%郎' AND `users`.`name` LIKE '%太郎')

*_not_end_any

後方不一致のNOT LIKE検索のOR検索を行います。
検索ワードで入力された文字が末尾につかないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_end_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_end_any

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%郎' OR `users`.`name` NOT LIKE '%太郎')

*_not_end_all

後方不一致のNOT LIKE検索のAND検索を行います。
検索ワードで入力された文字が末尾につかないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_end_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_end_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%ゆうこ' AND `users`.`name` NOT LIKE '%なお')

*_cont

LIKE検索を行います。
検索ワードで入力された文字が含まれるレコードを取得します。

ビューファイル | *_cont
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 %>

cont

上の例だと文字の中に「田」が含まれるレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` LIKE '%田%'

*_cont_any

LIKE検索のOR検索を行います。
検索ワードで入力された文字が含まれるレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_cont_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

cont_any

上の例だと文字の中に「森」か「中」が含まれるレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%森%' OR `users`.`name` LIKE '%中%')

*_cont_all

LIKE検索のAND検索を行います。
検索ワードで入力された文字が含まれるレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_cont_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

cont_all

上の例だと文字の中に「森」と「田」の両方が含まれるレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` LIKE '%森%' AND `users`.`name` LIKE '%田%')

*_not_cont

NOT LIKE検索を行います。
検索ワードで入力された文字が含まれないレコードを取得します。

ビューファイル | *_not_cont
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 %>

not_cont

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`name` NOT LIKE '%田%'

*_not_cont_any

NOT LIKE検索のOR検索を行います。
検索ワードで入力された文字が含まれないレコードを複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_cont_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_cont_any

上の例だと「森」が含まれないレコード、または「田」が含まれないレコードが取得されます。
「田中ゆうこ」だと森が含まれていないため取得されます。
「森山太郎」だと「田」が含まれていないため取得されます。
「森田健作」だと「森」が含まれていないという条件と「田」が含まれていないというどちらの条件も満たしているため取得されません。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%森%' OR `users`.`name` NOT LIKE '%田%')

*_not_cont_all

NOT LIKE検索のAND検索を行います。
検索ワードで入力された文字が含まれないレコードを複数の条件を指定して検索します。
指定した条件のうち全てが当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_cont_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_cont_all

上の例だと「森」という文字と「田」という文字両方が含まれていないレコードを取得します。

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (`users`.`name` NOT LIKE '%森%' AND `users`.`name` NOT LIKE '%田%')

*_i_cont

LOWERのLIKE検索を行います。
検索ワードで入力された文字が含まれるレコードを大文字と小文字を区別しないで検索します。

ビューファイル | *_i_cont
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 %>

i_cont

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE LOWER(`users`.`name`) LIKE '%tanaka%'

*_i_cont_any

LOWERのLIKE検索のOR検索を行います。
検索ワードで入力された文字が含まれるレコードを大文字と小文字を区別せず複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_i_cont_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

_i_cont_any

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (LOWER(`users`.`name`) LIKE '%ta%' OR LOWER(`users`.`name`) LIKE '%mo%')

*_i_cont_all

LOWERのLIKE検索のAND検索を行います。
検索ワードで入力された文字が含まれるレコードを大文字と小文字を区別せず複数の条件を指定して検索します。
指定した条件のうち全てが当てはまるレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_i_cont_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

_i_cont_all

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE (LOWER(`users`.`name`) LIKE '%ta%' AND LOWER(`users`.`name`) LIKE '%mo%')

*_not_i_cont

LOWERのNOT LIKE検索を行います。
検索ワードで入力された文字が含まれないレコードを大文字と小文字を区別しないで取得します。

ビューファイル | *_not_i_cont
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 %>

not_i_cont

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE LOWER(`users`.`name`) NOT LIKE '%ta%'

*_not_i_cont_any

LOWERのNOT LIKE検索のOR検索を行います。
検索ワードで入力された文字が含まれないレコードを大文字と小文字を区別せず複数の条件を指定して検索します。
指定した条件のうち一つでも当てはまらないレコードが取得されます。
複数の条件を指定するので、name属性に工夫が必要になります。

ビューファイル | *_not_i_cont_any
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_i_cont_any

ターミナル | 発行されるSQL
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属性に工夫が必要になります。

ビューファイル | *_i_cont_all
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属性の末尾に[]をつける必要があります。
フォームは何個でも増やすことができます。

not_i_cont_all

ターミナル | 発行されるSQL
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を、0falseの文字をFALSEとみなします。
※数値の場合0以外は1と判定されます。

ビューファイル | *_true
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 %>

true

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`gender` = TRUE

*_false

真偽値を判定する検索を行います。
検索ワードに入力した値がtrueの場合にfalseのレコードを、falseの場合にtrueのレコードを取得します。
SQLでは数字の1や文字列、trueの文字がTRUEを、0falseの文字をFALSEとみなします。
※数値の場合0以外は1と判定されます。

ビューファイル | *_false
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 %>

false

ターミナル | 発行されるSQL
1
SELECT `users`.* FROM `users` WHERE `users`.`gender` != FALSE

このようにransackでは条件を指定できるメソッドが豊富に用意されています。
ぜひこれらのメソッドを使い分けて使いやすい検索フォームを作成してみてください。

この記事のまとめ

  • ransackは検索機能を簡単に実装できるgemです
  • ransackで用意されているメソッドを使うことにより、色々な条件の検索フォームを簡単に作成できます
  • 並び替えができるソート機能も簡単に実装することができます

2

わかった!