Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby on Rails | scopeでModelに検索条件を定義

概要

scopeでModelに検索条件を定義

内容

scopeを利用して、Modelによく利用する検索条件を定義することができます。

scope(スコープ名, 条件式)

scopeメソッドはチェーンして流れるようなインターフェースで利用することも可能です。

サンプル

ユーザーの検索条件をスコープとして登録
Model(Scope定義部のみ抜粋)

scope :login_is, lambda {|login|where("login like ?", "%#{login}%")}
scope :name_is, lambda {|name|where("name like ?", "%#{name}%")}
scope :email_is, lambda {|email|where("email like ?", "%#{email}%")}

これで、ログイン・名前・Emailの項目を組み合わせてAND条件のlike検索が可能になりました。

呼び出し例
View(検索入力部のみ抜粋)

= form_for @user, :url => {:action => "search"} do |user|
  %table{:class => 'user_search'}
    %tr 
      %td 
        =label_tag 'login', tara('user', 'login')
      %td 
        =text_field :user, :login
    %tr 
      %td 
        =label_tag 'name', tara('user', 'name')
      %td 
        =text_field :user, :name
    %tr 
      %td
        =label_tag 'email', tara('user', 'email')
      %td
        =text_field :user, :email
  =link_to_submit "検索", "icon-search"
  =link_to_clear "クリア", "icon-eraser"
%hr/ 

Controller(検索関連部のみ抜粋)

class UserController < ApplicationController
  # 他の処理

  def search
    @user ||= User.new

    @user.name = params[:user][:name]
    @user.login = params[:user][:login]
    @user.email = params[:user][:email]
    @users = User.login_is(params[:user][:login]).name_is(params[:user][:name]).email_is(params[:user][:email])
    render_partial menu_display: true, message_display: true
    return render :action => 'list' 
  end

  # 他の処理
end

画像

検索前

ログイン名のみ指定して検索

ログイン名と名前で複合検索