updated on 2019-07-26
Rails 5.2.1
ruby 2.4.2
Postテーブルのtitleから投稿を検索する機能の実装
postsテーブルの構造
create_table "posts", force: :cascade do |t| t.string "title" t.text "body" t.datetime "created_at", null: false t.datetime "updated_at", null: false end
selfを忘れない。selfが抜けるとインスタンスメソッドになってしまう。
ILIKE - 条件検索で大文字小文字を区別させないために今回はLIKEではなく、ILIKEを使った。
ここ大事です。
(mode/post.rb) class Post < ApplicationRecord def self.search(search) if search # Controllerから渡されたパラメータが!= nilの場合は、titleカラムを部分一致検索 Post.where(['title ILIKE ?', "%#{search}%"]) else Post.all #全て表示。 end end end
ルートページだけ検索機能が欲しかったので posts/index.html.erbに以下を追記
(posts/index.html.erb)
<%= form_tag posts_path, :method => 'get' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
<% end %>
<% @posts.each do |post| %>
<div class="text-center">
<h2><%= article.title %></h2>
<h6><%= article.created_at.strftime('%b %d, %Y') %></h6>
</div>
<% end %>
(posts_constoller.rb)
class PostsController < ApplicationController def index @posts = Post.search(params[:search]) end end
以上で終了!!
検索機能は、プラグインとか使わなくても簡単に実装できる。
gem 'ransack'とかでの検索機能が流行ってるけど、なるべく自分で作れそうなものは作った方が良い!!(カスタマイズとかしやすいし、仕組みもわかってた方が良い)
参考資料
https://freesworder.net/rails-search/