Rails 検索機能は自力でも簡単に実装できる


どうもチャンクノです!
今回は検索機能を実装します。
スクールとかではransackや検索用のコントローラーを用意していたと思いますが、それらの方法でなくとも実装できます。

完成図から見せます。

Class Hoge < ApplicationRecord
  include Hoge::Searchable
end
module Hoge::Searchable
  extend ActiveSupport::Concern

  include do
    scope :search_by_foo, lambda { |foo|
      return if foo.blank?
      where("hoge.foo" => foo)
    }
  end
end
class TradeSearchForm
  include ActiveModel::Model

  attr_accessor :foo

  def search
    Hoge
      .search_by_foo(foo)
  end

end
class User::TradesController < User::ApplicationController

  def index
    @hoge_search_form = HogeSearchForm.new(hoge_search_params)
    @hoges = @hoge_search_form.search
              .order(id: :desc)
              .page(params[:page])
              .per(4)
  end

  private

  def hoge_search_params
    return if params[:hoge_search_form].blank?
    params.require(:hoge_search_form).permit(
      :hoge
    )
  end
end
<%= form_with model: @hoge_search_form, url: hoges_path, method: :get, local: true do |f| %>
  <%= f.text_field :hoge %>
<% end %>

こんな感じです。

ちなみにTradeSearchFormクラスをなくして

def index
    @hoges = Hoge
              .search_by_foo(params[:foo])
              .order(id: :desc)
              .page(params[:page])
              .per(4)
  end

  private

  def hoge_search_params
    params.require(:hoge).permit(
      :foo
    )
  end

こういう風にもできますが、メソッドが増えるたびコントローラーに記述しなければならなくなるので好ましくはないと思います。
検索用のクラスを用意してそこにまとめた方がいいでしょう。

ActiveModel::ModelやActiveSupport::Concernについては自分も理解しきれていないのですが、こういうやり方もあるということで紹介させていただきました!!
試しに使ってみるといいと思います!
それでは今日はこの辺で!
何か指摘等ありましたら遠慮なくお願いいたします🙇‍♂️

皆様よきプログラミングライフを🙏