賢くなりたいトイプードルの日記

データサイエンス系の話をメインにしていきます

Ransackで親テーブルや子テーブルのカラムで複数検索する方法

以下のようなモデル同士の関係がある。

#model/user.rb

has_many :bookmark
#model/bookmark.rb

belongs_to :users

つまりusersテーブルの子テーブルがbookmarksテーブル。

bookmarks/index.html.erbで親要素userの名前で検索したい。そんな時、こうする。

#bookmarks_controller.rb

    def index
        @q         = Bookmark.ransack(params[:q])
        @q.sorts   = 'created_at desc' if @query.sorts.empty?
        @bookmarks = @q.result(distinct: true)
    end
#bookmarks/index.html.erb
<%= search_form_for @q, url: bookmarks_path do |f| %>
  <dl>
    <dt><%= f.label :user_name_cont, "ユーザー名" %></dt>
    <dd><%= f.search_field :user_name_cont %></dd>
  </dl>
  <%= f.submit class: 'search-q-btn' %>
<% end %>

users/index.html.erbで子要素bookmarkのcreated_atの期間で検索したい。そんな時、こうする。

#users_controller.rb

    def index
        @q         = User.ransack(params[:q])
        @q.sorts   = 'created_at desc' if @query.sorts.empty?
        @users = @q.result(distinct: true)
    end
#users/index.html.erb
<%= search_form_for @q, url: bookmarks_path do |f| %>
  <dl>
    <dt><%= f.label :created_at_gteq, "期間", class: 'dt-term' %></dt>
      <dd><%= f.search_field :bookmarks_created_at_gteq, class: 'datepicker', placeholder: "○○年○○月○○日以上", value: fdate(params[:q] && params[:q][:bookmarks_created_at_gteq]) %><b> 〜 </b><%= f.search_field :bookmarks_created_at_lteq, class: "datepicker", placeholder: "△△年△△月△△日以下", value: fdate(params[:q] && params[:q][:bookmarks_created_at_lteq]) %></dd>
          </dl>
  <%= f.submit class: 'search-q-btn' %>
<% end %>

ransackable_associationsっていうメソッドでアソシエーションを調べられて便利。

User.ransackable_associations 

[
[1] "bookmark",
[2] "requests"
]

Bookmark.ransackable_associations 

[
[1] "user",
[2] "request"
]

ちなみに複数テーブルで検索することも可能。

#OR検索
<%= f.search_field :user_name_or_request_name_cont %>

#AND検索
<%= f.search_field :user_name_and_request_name_cont %>