#author("2016-09-29T16:03:57+09:00","default:wikiwriter","wikiwriter")
&tag(Ransack);
*目次 [#mbfa3f82]
#contents
*参考情報 [#ufc216e0]
-[[activerecord-hackery/ransack:https://github.com/activerecord-hackery/ransack]] // 公式サイト
-[[#370 Ransack - RailsCasts:http://railscasts.com/episodes/370-ransack?language=ja&view=asciicast]]
-[[Ruby - Ransackのススメ - Qiita [キータ]:http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0]]
*概要 [#t14acaff]
-Railsで検索画面を作るための(?)gem。
-Kaminariと組み合わせ、カラムクリックでソートすることもできる。

*簡単な使い方 [#z3adda50]
**インストール [#a39b267a]
-Gemfileにransackを追加。
 gem "ransack"


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

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

**ビュー [#x2d55501]
-検索条件を指定するフォームの作成
#pre{{
<%= search_form_for @search do |f| %>
        <%= f.text_field :title_cont %>
        <%= f.submit '検索' %>
<% end %>

<% @items.each do |item| %>
(省略)
<% end %>

}}


*複雑な使い方 [#sc45293f]
**ransack_demo [#f2c86b7b]
[[ernie/ransack_demo:https://github.com/ernie/ransack_demo]]と、それを解説した[[#370 Ransack - RailsCasts:http://railscasts.com/episodes/370-ransack?language=ja&view=asciicast]]が参考になる。
***セットアップ [#b9902986]
-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 にアクセス

*ビュー [#s2e33ac9]

**search_form_for [#oe9ebf24]
-search_form_forの定義は次のようになっている
#pre{{
      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 [#q479a17d]
**orderを手動で指定したい場合 [#n4cd42c5]
-[[Sorting in the Controller &#183; activerecord-hackery/ransack Wiki:https://github.com/activerecord-hackery/ransack/wiki/Sorting-in-the-Controller]]に方法が書いてある
#pre{{
@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を手動で指定したい場合(古い方法) [#p7643075]
-params[:q][:s]にORDER BYの値を渡してやる。
  params[:q][:s] = "rating desc"
-もしくはresult.orderでソート。
 @search.result.order("rating desc")


**カラムクリックしたときの初回のソートの向きを指定したい [#rd598170]
-sort_linkのdefault_orderを指定する。
 <%= sort_link(@q, :name, 'Last Name', default_order: :desc) %>

**カラムクリックしたとき、セカンドキーを指定したい(2番目以降は固定) [#g76343ea]
-カラムのシンボルの後に、ソートに使う配列を指定する。以下の場合: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番目以降もトグル) [#yc3d7103]
-ソート配列はシンボルにして、default_orderで初期ソート方向を指定する。
#pre{{
<%= sort_link(@q, :last_name, %i(last_name first_name),
  default_order: { last_name: 'asc', first_name: 'desc' }) %>
}}
**テーブルカラムと対応しない列で並べ替える場合 [#z755b783]
-上の応用となる。sort_orderにリストで選択された"ソート順"が入っているとする。そのソート順からORDER BYの文字列を作ってやりセットする。
 params[:q][:s] = build_sql(params[:sort_order])
-view側で、params[:sort_order]を初期値としてセットしてやれば条件も引き回せる。


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

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

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS