Tag: Ransack

目次

参考情報

概要

  • Railsで検索画面を作るための(?)gem。
  • Kaminariと組み合わせ、カラムクリックでソートすることもできる。

簡単な使い方

インストール

  • Gemfileにransackを追加。
    gem "ransack"

コントローラ

  • コントローラーのaction。例えばindexで検索する場合次のようになる。
    def index
      @search = Item.ransack(params[:q])
      @items = @search.result
    end
    

※searchじゃなくてransackメソッドのほうが推奨になったらしい(公式サイト)

ビュー

  • 検索条件を指定するフォームの作成
    <%= search_form_for @search do |f| %>
            <%= f.text_field :title_cont %>
            <%= f.submit '検索' %>
    <% end %>
    
    <% @items.each do |item| %>
    (省略)
    <% end %>
    
    

述語の指定

  • ビューでは、フィールド名の後ろに特定のワードを追加して条件を指定する。
  • 例えばtitle_contならばtitleに指定した文字が含まれるもの、age_gtならば指定した年齢以上の年齢のように。

eq

  • 指定条件に一致するもの

lt

  • 指定条件より小さいもの。age_ltは「age <」。

lteq

  • 指定条件以下のもの。age_lteqは「age <= 」。

gt

  • 指定条件より大きいもの。age_gtは「age > 」。

gteq

  • 指定条件より大きいもの。age_gteqは「age >=」。

複雑な使い方

ransack_demo

ernie/ransack_demoと、それを解説した#370 Ransack - RailsCastsが参考になる。

セットアップ

  • git clone
    git clone https://github.com/ernie/ransack_demo
  • bundle install
    bundle install --path vendor/bundle
  • データベース作成(postgresqlが必要。MacPorts/postgresql。ransack_demoユーザーを作成しておく)
    bundle exec rake db:create:all
  • テーブル作成
    bundle exec rake db:migrate
  • テストデータ投入
    bundle exec rake db:fixtures:load
  • サーバー実行
    bundle exec rails s
  • ブラウザから http://localhost:3000 にアクセス

ビュー

search_form_for

  • search_form_forの定義は次のようになっている
          def search_form_for(record, options = {}, &proc)
    
  • 最も単純
    <%= search_form_for(@search) do |f| %>
  • クラスとurlを指定
    <%= search_form_for(@search, url: items_path, html: {class: 'form-inline'}) do |f| %>

Tips

orderを手動で指定したい場合

  • Sorting in the Controller · activerecord-hackery/ransack Wikiに方法が書いてある
    @search = Post.ransack(params[:q])
    @search.sorts = 'name asc' if @search.sorts.empty? #一つの場合
    @search.sorts = ['name asc', 'created_at desc'] if @search.sorts.empty? # 複数の場合
    @posts = @search.result.paginate(page: params[:page], per_page: 20)
    
  • params[:q][:s]に無理やり突っ込む方法は古い。

orderを手動で指定したい場合(古い方法)

  • params[:q][:s]にORDER BYの値を渡してやる。
     params[:q][:s] = "rating desc"
  • もしくはresult.orderでソート。
    @search.result.order("rating desc")

カラムクリックしたときの初回のソートの向きを指定したい

  • sort_linkのdefault_orderを指定する。
    <%= sort_link(@q, :name, 'Last Name', default_order: :desc) %>

カラムクリックしたとき、セカンドキーを指定したい(2番目以降は固定)

  • カラムのシンボルの後に、ソートに使う配列を指定する。以下の場合:last_nameと'first_name asc'でソートすることになる。  <%= sort_link(@q, :last_name, [:last_name, 'first_name asc'], 'Last Name') %>
  • カラムをクリックすると、「last_name asc」「last_name desc」のあと「first_name asc」が組み合わさってソートされる。
  • first_nameの方向は入れ替わらないことに注意。

カラムクリックしたとき、セカンドキーを指定したい(2番目以降もトグル)

  • ソート配列はシンボルにして、default_orderで初期ソート方向を指定する。
    <%= sort_link(@q, :last_name, %i(last_name first_name),
      default_order: { last_name: 'asc', first_name: 'desc' }) %>
    

テーブルカラムと対応しない列で並べ替える場合

  • 上の応用となる。sort_orderにリストで選択された"ソート順"が入っているとする。そのソート順からORDER BYの文字列を作ってやりセットする。
    params[:q][:s] = build_sql(params[:sort_order])
  • view側で、params[:sort_order]を初期値としてセットしてやれば条件も引き回せる。

検索条件の引き回し

  • 検索フォームとページングのナビゲーションを組み合わせて使う場合、検索ボタンを押して検索したパラメータが、ページングのナビゲーションに追加されて検索条件が引き回されることになる。
  • 検索条件を変えたら、いったん検索しないといけない。

検索パラメータの書き換え

  • 検索対象のカラムに直接該当しない値を画面から渡したい場合。
  • ビュー側でf.selectを使うとransackのモデルにカラムが存在するかどうかのチェックが働く。select_tagのようにtagを使う。
          <%= select_tag("q[complex_cond]", options_for_select()..) %>
    
  • コントローラーがわでparams[:q]のチェックを行い、ransackが認識可能なパラメータに置き換える
    if complex_cond == '1'
       @search.title_eq ='あああ'
    end

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-06-20 (火) 15:34:55 (639d)