初めに
現役エンジニアの方からPFのフィードバックをいただきましたので、 リファクタリングを進めていきます。実装している検索機能は以下の通りです。
元々のコード
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