Railsのキャプションにハッシュタグ機能を実装する

自宅のPCがGTX-750Tiを積んでいるので機械学習を!と、Ubuntuを入れたもののNVIDIAドライバーがインストールできず、かつ、端末も使いにくく悪戦苦闘している私です。。トホホ…
そんな曇天な状況ですが沖縄が梅雨明けになるなど確実に今年も熱い季節が間近に迫っております。

詳しい全体像はまたの機会に話しますが、研修ではインスタグラムライクなものを作りました。
追加機能とはなりますが数多の機能の中でもとりわけこだわったハッシュタグ機能について、 その作り方を今回は書いていきます。

完成した姿

先に完成状態を示します。

仕組みとしては以下の図のイメージです。

(1)投稿時にハッシュ記号と一緒に入力
(2)投稿したキャプションはそのままDBに保存
(3)保存直後に”#”~半角スペースまでを単位として読み取り、hashtagテーブルに保存
(4)viewの呼び出し時にハッシュタグ部分をリンク化 (5)ハッシュタグをクリックすることでハッシュタグページに遷移

ハッシュタグの考え方

ハッシュタグは一つの投稿(micropost)に対して複数つけることができます。
これを視点別に見るとすれば、 ・micropost的視点:一つのmicropostに複数のhashtagを持つ
・hashtag的視点 :一つのhashtagは複数のmicropostに属する といえます。
この関係から以下の図のように多対多の関係となります。

したがって必要となるのは中間テーブルです。
以下ではこられを追加していきます。

各種テーブルの準備

hashtagテーブルの用意

新たにhashtagテーブルを用意します。

Railsではお作法として、モデル名は単数形、コントローラーは複数形で記述する規約があります。
このとき、カラム(hashname)をstring型で作ります。

hashtagマイグレーションファイルの編集

中間テーブルの作成

referencesを使うことで外部キーをのカラムを生成できます。

中間テーブルのマイグレーションファイル編集

t.referenceはあくまで外部キー制約をつけられるようになったというだけです。
言い換えればt.referencesの記述があることでforeigh_key:trueを使用することができます。
これにより外部キーが有効になります。

レッツマイグレート

モデルの編集

micropostモデルに下記を追記

ここではrailsのコールバック機能を使ってDB保存直後に該当文字列を抽出してhashtagテーブルに保存するようにしています。
今回のキャプションは編集不可なのでbefore_updateは使わないもの、after_createとほぼ同じなので記述しています。

中間テーブルモデル

中間テーブルに属するのはmicropostとHashtagモデルですので両者の名前をbelongs_toで書きます。
ちなみにhas_manyするときは複数形、belongs_toされるときは単数形で書くのが常だそうです。

hashtagモデル

hashtagとして記述できる文字列:hashnameは本物のインスタグラムと同じ99字を登録の上限としています。
has_and_belongs_to_manyは多対多で紐付けるためのもので、ここではmicropostsと紐づけています。

コントローラーの編集

micropostコントローラーにhashtagのアクション記述

ヘルパーの編集

micropostヘルパーの編集

メソッドを定義しています。
キャプション内部のハッシュタグ記号を読み取りリンク化します。
またリンク化されたものはそのhashname名を末尾にとったURLを生成し、hashname専用のページに遷移します。

ルーティング

hashnameを末尾にとったURLに行くようにしています。

Viewの編集

キャプションの追加(micropostパーシャルに)

ヘルパーで作ったメソッドと使い、キャプションに対してリンク化をするように仕掛けます。

という感じでやっていくとハッシュタグの実装ができます。
お時間あるときにどうぞチャレンジください。

こんにちは。2018年3月1日入社のごっぴーと申します。

趣味は山登りで行きたいと思ったら天気だけ見てふらっといきます。どこでもいきます、登ります。

この職種は初めてですがやりたかったことなのでどんどん貪欲にチャレンジしたいと思っています。

山も海(ダイビング)も想像力が必要ですがこの仕事にも通じるところはあると思うので、悪戦苦闘しながらも

最後は登頂できるように努めたいと思います。よろしくお願い致します。

※記事の内容は保証はしておりません(執筆時期や実施環境により挙動が変わるものがある為)。
別途検証してご利用いただくことをおすすめいたします。