3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

初学者検索機能がんばる

Last updated at Posted at 2018-12-25

何を検索できるようにしたい?

タイトルを入力したらその本の情報が出てくる
著者名を入力したらその本の情報が出てくる
あいまい検索したい(今回初めて知りました)
複数の入力で検索をできるようにする

検索画面の表示部分

header.html.rb
          <%= form_with(url: '/search', local: true, method: :get) do |form| %>
            <%= form.text_field :search_key %>
            <%= form.submit 'ぼたん' %>
          <% end%>

デフォルトがpostなのでmethod: :getでgetを指定する

form_with で生成されたフォームは、デフォルトで非同期で送信される。それを避けるためにlocal: trueを指定しないとform_withがどの場所で処理を行えばいいのかわからなくなってしまう

table

db/migrate/books.rb
   def change
    create_table :books do |t|
      t.string :title
      t.string :author

タイトルと著者名をとってこれる

controller

controller.rb
    def search   
      # 検索結果をurlに埋め込むのと、モデルで部分一致させる検索結果を送るための処理
      @books = Book.search(params[:search_key])
      if @books
        redirect_to "/search/#{params[:search_key]}"
      else
        @books = Book.all
        redirect_to "/search/#{params[:search_key]}"
      end
    end

    def search_page  # 検索結果を表示させるページのコントローラーです!
      search_key_word = params[:search_key]
      @books = Book.where('title LIKE ? OR author LIKE ?', "%#{search_key_word}%", "%#{search_key_word}%")    # titleかauthorのカラムどちらかと部分一致すれば取り出す
      if  @books.empty?
        @book_not_found_message = 'キーワードに該当するページが見つかりません'
        render 'search_page'
      end
    end
# booksテーブルのtitleカラムに部分一致したレコードを返す
Book.where('title LIKE ?', "%#{search_key_word}%")
# booksテーブルのtitleカラムもしくはauthorカラムに部分一致したレコードを返す
Book.where('title LIKE ? AND author LIKE ?', "%#{search_key_word}%", "%#{search_key_word}%")

model

app/models/application.rb
  def self.search(search) #selfはBook
    if search
      where(['content LIKE ?', "%#{search}%"]) #検索結果がcontentと一部でも一致するかどうかをみて一致するものがあればそれをwhereで受け取るはず
    else
      all #全て表示
    end
  end
# この部分に対する私の認識は儀式
where(['content LIKE ?', "%#{search}%"])

反省

二つ以上のテーブルを対象に検索することを複数検索だと思ってたけどそんなわけないですね。やはり理解していなかったので気付けてよかった

参考にさせていただきました

[railsで複数ワードでの検索機能(or)とマイナス検索機能(-)を実装してみる]
(https://qiita.com/Orangina1050/items/ca4e5dc26e0a32ee3137)

よんでくれてありがとう

3
2
2

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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?