Acts As Taggable On (AATO)
多くの既存ユーザー(利用開発者)のいる老舗タグ管理ライブラリ。
-
最初のバージョンが2009年なこともあり、設計・コードベースが古くなっています
-
原作者からメンテナであるAbdelkader Boudih(seuros)氏にバトンタッチ済みで、(完全に)メンテナンスモードとなっています
-
原作者不在 & 既存ユーザーにヘビー(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) アプリケーション全体でタグを共有する場合
include NoFlyList::TaggableRecord
has_tags :コンテキスト名の複数形, polymorphic: true
B) モデル毎にタグを管理する場合
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の移行時には次の手順を行います。
- 上記のマイグレーションファイルを用いて、NFL用のテーブルを作成する。
- AATO用のテーブルからNFL用のテーブルにデータを移行する。
- AATO用のテーブルを削除するマイグレーションファイルを作成、そのマイグレーションファイルを用いて、AATO用のテーブルを削除する。
下記はAATO → NFL 移行時に作成したデータ移行バッチです、ご参考にどうぞ。
# 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