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 %>