何を書けばいいのか悩んだ末の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