Concernモジュールとは
Concernは日本語では関心事という意味です。関心事の中でも、複数のモデルや機能に影響するようなものを横断的関心事と呼びます。例としては、以下のようなものが挙げられます。
- ロギング
- タグによる分類(taggable)
- レコードの論理削除(soft_deletable)
- 外部サービスとの連携
このような機能はgemで提供されている場合もありますが、gemにロックインされる事を避けたり、自社のサービス固有の機能を実装したいこともあるでしょう。このような横断的関心事を実装するときに、Concernモジュールとして実装します。
Concernモジュール化する事により、Fat Modelを避けたり、DRYを実現する事にもなります。
横断的関心事ってスーパークラスでも扱えるんじゃ...
確かに、共通機能をスーパークラスに抽出しても、同じ事を実現できそうですが、Rubyは複数のスーパークラスを保持できません。既に継承を行っているクラスに対して共通機能を追加するには、複数のConcernモジュールを使ってincludeする方が柔軟に扱えると考えています。
Rails3への導入手順
諸々の理由でRails3を用いている現場もあるでしょうから、ここではRails3への導入手順をご説明します。
プロジェクトのルートフォルダで、まずはモデルのconcerns用のフォルダを作成します。
mkdir -p app/models/concerns
オートロードのパスに、先ほど作成したディレクトリを追加
config.autoload_paths += %W(
#{config.root}/app/models/concerns
)
あと、
touch tmp/restart.txt
も必要だっけ?
Concernsモジュールの実装 (例:論理削除)
では、concernsモジュールを実装してみましょう。
たとえば、論理削除の機能を実装したい場合は、
soft_deletable.rbを、wget等を用いてapp/models/concernsに配置してみましょう。
その後、READMEに従ってマイグレーションを行えば、準備完了。
モデルの側では、このようにSoftDeletableモジュールをincludeできます。
class Comment < ActiveRecord::Base
include SoftDeletable
end
このようにして、Commentモデルに論理削除とリストアの機能を実装できました。
論理削除、リストアを実施するときには、以下のようにして用います。
Comment.first.delete
Comment.first.restore
最後に
間違いなどございましたら、ご指摘ください。