2
4

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.

rails タグ検索実装

Posted at

##はじめに
自作のポータルサイトにタグ検索を実装したので、復習しておきます。
http://nishikanako.work

##方法

下記のソースのように、スクレイピングしてきたurlのタイトルと説明文の中に、選択しているキーワードがあれば、抜き出してテーブルにデータの中に保存。

scrape.rb
tag_keyword = ["あおい", "さくら", "きいろいゾウ", "通天閣", "しずく", "こうふく みどりの", "こうふく あかの", "窓の魚", "映画", "i", "イベント", "うつくしい人", "きりこについて", "炎上する君", "白いしるし", "円卓", "漁港の肉子ちゃん", "地下の鳩", "ふくわらい", "インタビュー", "サイン会", "ふる", "舞台", "サラバ", "まく子", "おまじない", "イベント", "劇場", "上映", "まにまに" ,"ご飯ぐるり", "作家", "小説家", "Youtube", "対談"]
      tag_keyword.each do |keyword|
        if (title+description).index(keyword) != nil then
          scrape_tag = ScrapeTag.create(
            :tag        =>  keyword,
            :scrape_id  =>  scrape.id
          )
          p '[Tag] ' + keyword
        end
      end

indexメソッドは、配列から引数objと同じ要素を探し、その位置を整数で返します(1番目が0、2番目が1、...)。要素が見つからないときは、nilを返します。
https://ref.xaio.jp/ruby/classes/array/index

とのこと。
上のソースを文章で整理すると、キーワードの存在性を一つ一つ検証する。ここで、タイトルと概要文のなかにキーワードがあれば(nilでなければ)、そのキーワードを該当するurlに紐づけて(scrape.id)、データとして保存する。二つのテーブルの紐付けは belongs_tohas_many を利用した。

これを記事の概要文の下に表示。

views/home.html.rb
<% scrape.scrape_tags.each do |tag| %>
 #bootstrap
  <span class="badge badge-lg badge-primary  ">
  <a href="/?keyword=<%= tag.tag %>" style="color:white"><%= tag.tag %></a>
  </span>
<% end %>

下の青のボックスの中に入った単語がタグとして表示される。
aタグでリンクにしているので、タグをクリックすればそのタグがついた記事がだけが表示されるようになる。

スクリーンショット 2019-04-16 16.31.35.png

上記のようにするには、contorollerの方で記事の集合体のインスタンス変数(@scrapes)を条件に分けて定義する必要がある。

sample_controller.rb
def home
    if params[:keyword].present?
      @scrapes = Scrape.where("title LIKE ? or description LIKE ?","%"+params[:keyword]+"%","%"+params[:keyword]+"%").paginate(page: params[:page],:per_page => 21).includes(:scrape_tags)
    else
      @scrapes = Scrape.paginate(page: params[:page],:per_page => 21).includes(:scrape_tags)
    end
end

paramsでキーワードの存在性を確認して、ない場合は全ての記事を取得、ある場合はタイトルか概要文にキーワードが含まれている記事だけを取得するようにしている。

##終わりに
今回,mecabを利用しようと思いましたが、例えば名詞だけを抜き取ろうとしたところ、あまり有用性のある単語がなかったので、indexメソッドを利用しました。

解説不足なところがありましたら、コメントよろしくお願いします♪( ´▽`)

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?