acts-as-taggable-on を使い込む

acts-as-taggable-onは、アプリケーションを早く作りたいときにとても便利で context というカラムを使うことで、tags以外にも同様なインターフェースを持つ別名のタグとして使うことができます。

例えば、特定の値のみをフォームから登録する、という実装をしてみます。
下記コードで新たにテーブルを作成することなく、画面から Keyboard#keyswitch_types の読み書きできるようになります。

class Keyboard < ApplicationRecord
  KEYSWITCH_TYPES = {
    "membrane" =>   'メンブレン',
    "pantograph" => 'パンタグラフ',
    "mechanical" => 'メカニカル',
    "capacitive" => '静電容量無接点方式',
    "butterfly" =>  'バタフライ',
  }

  acts_as_taggable_on \
    :keyswitch_types,
end
= form_for @keyboard do |f|
    = f.label :keyswitch_type_list
    = f.select :keyswitch_type_list, Keyboard::KEYSWITCH_TYPES.map { |key, value| [value, key] }, include_blank: 'なし'

複数選択する場合のフォームの実装

= f.collection_check_boxes :tag_list, Keyboard::TAGS, :itself, :itself do |c|
  label style="margin-right: 20px"
    = c.check_box
    = c.text
    br
  • 開発の初期段階だと手戻りがいくらかあることが予想できるので、 acts-as-taggable-onで済むならテーブルの作り直しも発生しないので早く実装ができそうです。
  • acts_as_taggable_on は1コンテキスト毎に1つのSELECTクエリを吐きます。
  • tagsテーブルのレコードが増えるとなにか(count(*)だった気がする)のクエリでフルスキャンが走ってしまうので、無限にレコードが増えることが予想できる場合は acts_as_taggable_onを使わないほうがいいと思います。