s_kajigo
@s_kajigo (kaji shogo)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Rails 絞り込み検索機能のコントローラーの記法について

現在Rails ApiでUser検索機能を実装中です。
スクリーンショット 2022-11-25 19.58.20.png

このようなフォームから検索ボタンで、性別、年代、キーワードの情報をrailsに送信し、当てはまる条件のユーザーを返すコードを記述したのですが、正常に機能するものの記述の方法に疑問があります。いかが記述したコードです。

  def search
    users = User.all 
    users = users.where(sex: user_params[:sex]) if user_params[:sex].present?
    users = users.where(age: user_params[:age]) if user_params[:age].present?
    users = users.where('name LIKE(?) or profile LIKE(?) or favorite LIKE(?)',"%#{user_params[:key_word]}%","%#{user_params[:key_word]}%","%#{user_params[:key_word]}%") if user_params[:key_word].present?
    
    render json:{ status: 200, users: users }
  end

 private

    def user_params
      params.permit(:name, :sex, :age, :favorite, :profile,:key_word)
    end

フォームで指定しないを選択するとから文字が送信されるようになっているので、ifで条件の指定があれば絞り込みを行うようにしています。
usersを繰り返し使用して絞り込んでいく部分や、後置ifを使うべきかどうかについて、皆さんでしたらどのように記述、実装するか参考にさせていただけると幸いです。

0

2Answer

良いんじゃないでしょうか
scopeとメソッドチェーンでつなげるやり方もあります

class User < ApplicationRecord
  scope :filter_sex, ->(sex) do
    return self if sex.blank?
    where(sex: sex)
  end

  scope :filter_age, ->(age) do
    return self if age.blank?
    where(age: age)
  end

  scope :filter_by_keyword, ->(keyword) do
    return self if keyword.blank?
    where('name LIKE(?) or profile LIKE(?) or favorite LIKE(?)',"%#{keyword}%","%#{keyword}%","%#{keyword}%")
  end
end
class UserController < ApplicationController
  def search
    users = User
              .all
              .filter_sex(user_params[:sex])
              .filter_age(user_params[:age])
              .filter_by_keyword(user_params[:keyword])
    
    render json:{ status: 200, users: users }
  end

  private

  def user_params
    params.permit(:sex, :age, :keyword)
  end
end

2Like

Comments

  1. @s_kajigo

    Questioner

    回答ありがとうございます。
    スッキリして大変読みやすくなりますね。参考にさせていただきます!

当初の質問の回答とは別で申し訳ないのですが、
クエリを記述する場合にはそもそも
モデルの中に「scope」という形式でする方がよろしいかと思います。

0Like

Comments

  1. @s_kajigo

    Questioner

    ありがとうございます。
    そうなんですね、参考にさせていただきこちらの方法でも書いてみます。

Your answer might help someone💌