何を書けばいいのか悩んだ末のact-as-taggable-on

初めまして!
7月からinterfirmでインターンをさせていただいている榊間です!

これから開発部プログを書いていこうということで、文章を書くスキルがほとんどないですが(ツイッターが限界)、これから週一回(たぶん)投稿させていただきます。

まず、僕の自己紹介から...
関西の大学の四年生で、今は東京に住んでインターン
初めてプログラミングをやったのが2月頃(PHP)で、rubyを学び始めたのは6月になってから

っていう感じなので、新しく覚えたことなんかを投稿していこうかと思ってます。

とりあえず最近やったタスクの中にあった、タグ管理のgemのひとつ、act-as-taggable-on(これしか書けそうになかった)について書いときます。



使い方

act-as-taggable-on(mbleigh/acts-as-taggable-on · GitHub)をインストールしたら

rake acts_as_taggable_on_engine:install:migrations
rake db:migrate

でタグ管理用のテーブルを勝手に作ってくれます。それから、タグを取り付けたいモデル(この場合はArticle)に以下のように記述します。

class Article < ActiveRecord::Base
  acts_as_taggable
end

これでタグを管理する準備が終わります。後はGithubにあるようなメソッドを使うだけで、タグの追加や削除などなどが行われます。とっても簡単です。



このact-as-taggable-onを使っていた時にちょっとつまずいたとこ

articlesの内容を検索する時に、articlesのテーブル内のカラム(例えばtitle)に加えて、tagにも検索をかけたい場合、whereで一緒に検索できない  ↓ダメな例

@articles = Article.where(['title LIKE ? or tag LIKE ? ', "%#{params[:search]}%","%#{params[:search]}%"])

(検索で入力したワードをparams[:search]で渡しているとする)
これは考えてみれば当たり前で、Articleモデルに関連付けているtagはそもそもarticlesテーブルに存在しておらず、最初に生成されたテーブルで管理されているからです。

ここでGithubに戻ってtagの検索方法を調べてみると、タグが付いているArticleをタグ検索(LIKE検索)したい場合は、下記のようにします。

@articles = Article.tagged_with(params[:search], :wild => true, :any => true)

じゃあこれを、titleカラムの検索と同時にしようとすると

@articles = Article.tagged_with(params[:search], :wild => true, :any => true) | Articles.where(['title LIKE ? ', "%#{params[:search]}%"])

こんな感じで、漏れなく検索できるようになりました!

後気をつけることは、この時の@articlesはもうActiveRecordクラスのメソッドが使えなくなるので、例えば並び替えの時とかは、orderじゃなくてsort_byとか使わなきゃいけないみたいです、、

ここ参考にしました
Railsでacts-as-taggable-onを使ってタグ管理を行う - Rails Webook



また学んだこととか書いていくのでよろしくお願いしますm(__)m