LoginSignup
0
0

More than 1 year has passed since last update.

[リファクタリング] ポートフォリオの検索機能 クラスメソッド

Posted at

初めに

現役エンジニアの方からPFのフィードバックをいただきましたので、
リファクタリングを進めていきます。

実装している検索機能は以下の通りです。

スクリーンショット 2021-10-01 10.08.40.png

元々のコード

models/post.rb
def self.search(search)
  return Post.all unless search
  Post.where('title LIKE(?)', "%#{search}%").or(Post.where('content LIKE(?)', "%#{search}%"))
end

修正後

models/post.rb
def self.search(search)
  return all unless search
  where('title LIKE(?)', "%#{search}%").or(where('content LIKE(?)', "%#{search}%"))
end

どこが変わったかというとPOSTの記載はことごとく消えています。

まずreturn Post.all unless searchですが、
return all unless searchに書き換えられ、
Post.where('title LIKE(?)where('title LIKE(?)'
or(Post.whereも、or(where(に書き換わっています。

search メソッドというのは、 Post クラスに定義されており、
search メソッドの実行主体は Post になり、実行主体が同じなので省略できます。
そしてsearch メソッドのなかで実行している
where(...) というメソッドの実行主体も Post になりますので省略可能です。

今回の場合Postがクラスで、search メソッドも、whereメソッド(where(...))も、
POSTを主体としたクラスメソッドになるため省略ができます。

他の箇所も同様に修正してみます

修正前

group.rb
 # 検索
  def self.search(search)
    return Group.all unless search

    Group.where('name LIKE(?)', "%#{search}%").or(Group.where('introduction LIKE(?)', "%#{search}%")).
      or(Group.where('status LIKE(?)', "%#{search}%"))
  end
end

修正後

group.rb
# 検索
  def self.search(search)
    return all unless search
    where('name LIKE(?)', "%#{search}%").or(where('introduction LIKE(?)', "%#{search}%")).
      or(where('status LIKE(?)', "%#{search}%"))
  end
end

修正後

user.rb
def self.search(search)
    return all unless search
    where('name LIKE(?)', "%#{search}%").
      or(where('introduction LIKE ?', "%#{search}%")).
      or(where(department_id: search)).or(where(join_year: search))
  end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0