0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Acts As Taggable On の後継? No Fly List

Last updated at Posted at 2025-11-14

Acts As Taggable On (AATO)

多くの既存ユーザー(利用開発者)のいる老舗タグ管理ライブラリ。

  1. 最初のバージョンが2009年なこともあり、設計・コードベースが古くなっています

  2. 原作者からメンテナであるAbdelkader Boudih(seuros)氏にバトンタッチ済みで、(完全に)メンテナンスモードとなっています

  3. 原作者不在 & 既存ユーザーにヘビー(AATOの内部構造に依存したコードを書いている)ユーザーがいることもあり、再設計からのビルド&スクラッチetcの大きな変更は難しい状態です

メンテナンスもバグFixとRailsの新バージョンへの対応がメインで、開発はアクティブではありません。

No Fly List (NFL)

AATO のメンテナであるAbdelkader Boudih(seuros)氏がAATOをベースに再設計し(新たに書き起こし)、開発しているライブラリ。

AATOよりパフォーマンスetcの面で優れています。

AATO とテーブル・データ構造がほぼ互換なので、AATOからの移行が容易です。

特徴

設定ファイルでの設定不要

設定ファイルにNFL固有の設定を記述するのではなく、モデル内に設定を記述します。
タグの連結・分割(・成形)についてはトランスフォーマー(後述)に記述します。

Rails 7.2以降対応

Rails 7.2以降のActiveRecordの機能を活用して、パフォーマンスを高めています。

PostgreSQL / MySQL/ SQLite3 対応

PostgreSQL / MySQL/ SQLite3、それぞれに応じて効率の良いSELECTクエリ(SQL)を生成します。

インストール

gem "no_fly_list"
>  bundle install

導入

A) アプリケーション全体でタグを共有する場合

bundle exec rails g no_fly_list:install

モデル ApplicationTag / ApplicationTagging、マイグレーションファイル、トランスフォーマー transformers/ApplicationTagTransformerが作成されます。

B) モデル毎にタグを管理する場合

1) モデルの作成

bundle exec rails g no_fly_list:models モデル名

モデル モデル名::Tagging / モデル名Tag が作成されます。

2) マイグレーションファイルの生成

bundle exec rails g no_fly_list:tagging モデル名

3) トランスフォーマーの作成

bundle exec rails g no_fly_list:transformer

トランスフォーマー transformers/ApplicationTagTransformerが作成されます。

使用法

1) タグと紐付けたいモデルに記述を追加します。

A) アプリケーション全体でタグを共有する場合

models/モデル名.rb
include NoFlyList::TaggableRecord

has_tags :コンテキスト名の複数形, polymorphic: true

B) モデル毎にタグを管理する場合

models/モデル名.rb
include NoFlyList::TaggableRecord

has_tags :コンテキスト名の複数形

has_tags にはpolymorphicの他にもオプションをセットできます。セットできるオプションについては、公式を参照してください。

has_tagsのオプションにてNFLの設定を行えます。

コンテキスト名 = タグの別名、モデル名.コンテキスト名の複数形_listでそのモデルインスタンスのタグ(別名)の配列を取得できます。

トランスフォーマー

タグの区切り文字 / 分割 / 結合 / 成形(余白の除去etc)について設定できるクラスです。

PostgreSQL / MySQL/ SQLite3 以外への対応

PostgreSQL / MySQL/ SQLite3、それぞれに対応するためのコードは NoFlyList::TaggableRecord::Query::DB名Strategyの形で集約されているので、こちらに対応したいDB用のDB名Strategyを追加して、DB判定→DBに対応したDB名Strategyを呼び出しているコードを修正すれば、PostgreSQL / MySQL/ SQLite3 以外のDBへの対応は可能となっています。

AATO との違い

設定方法

AATOでは、 設定ファイル(config/initializers/taggable.rb 等)に設定を記述するようになっていましたが、
NFL では、モデル or トランスフォーマーにて設定を行います。

モデル

AATO

デフォルトでは、ActsAsTaggableOn::Tag / ActsAsTaggableOn::Taggingの二つ。

NFL

A) アプリケーション全体でタグを共有する場合

ApplicationTag / ApplicationTagging の二つ。

B) モデル毎にタグを管理する場合

モデル名Tag / モデル名::Tagging の二つ。

トランスフォーマー

AATOにはないNFLの機能です。AATOでは設定ファイルに記述していたタグの区切り文字etcのタグまわりの設定をNFLでは
トランスフォーマーと

テーブル構造

ほぼ互換です。

A) アプリケーション全体でタグを共有する場合

application_tags / application_taggings の2つのテーブルが作成されます。

(AATO) tags → (NFL) application_tags

taggiings_count カラムはありません。タグ毎のカウント数については、NFLの機能にて取得可能です。

(AATO) taggings → (NFL)application_taggings

tagger_type、tagger_id カラムはありません。

B) モデル毎にタグを管理する場合

モデル名_tags / モデル名_taggings の2つのテーブルが作成されます。

モデル名_tags

application_tagsと違いはありません。

モデル名_taggings

application_taggingsのカラムのうち、taggable_typeはありません。

テーブルのデータ

ほぼ互換ですが、一部、異なります。

(AATO) taggingsテーブルのcontextカラムの値は複数形
(NFL) *_taggings テーブルのcontextカラムの値は単数形

AATO → NFL 移行

AATO → NFLの移行時には次の手順を行います。

  1. 上記のマイグレーションファイルを用いて、NFL用のテーブルを作成する。
  2. AATO用のテーブルからNFL用のテーブルにデータを移行する。
  3. AATO用のテーブルを削除するマイグレーションファイルを作成、そのマイグレーションファイルを用いて、AATO用のテーブルを削除する。

下記はAATO → NFL 移行時に作成したデータ移行バッチです、ご参考にどうぞ。

lib/tasks/from_aato_to_nfl.rake
# frozen_string_literal: true

namespace :sample do
  desc "From AATO to NFL"
  task from_aato_to_nfl: :environment do
    tag_id_map = {}
    ActsAsTaggableOn::Tag.all.each { |tag|
      application_tag = ApplicationTag.new
      application_tag.name = tag.name
      application_tag.save
      tag_id_map[tag.id] = application_tag.id
    }

    ActsAsTaggableOn::Tagging.all.each { |tagging|
      application_tagging = ApplicationTagging.new
      application_tagging.tag_id = tag_id_map[tagging.tag_id]
      application_tagging.taggable_type = tagging.taggable_type
      application_tagging.taggable_id = tagging.taggable_id
      application_tagging.context = tagging.context.singularize
      application_tagging.save
    }
  end
end
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?