LoginSignup
1
2

More than 5 years have passed since last update.

Rails3系にConcernsモジュールを導入しFat Modelを避ける

Last updated at Posted at 2015-02-16

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/applicatioin.rb
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できます。

app/models/comment.rb
class Comment < ActiveRecord::Base
  include SoftDeletable
end

このようにして、Commentモデルに論理削除とリストアの機能を実装できました。
論理削除、リストアを実施するときには、以下のようにして用います。

Comment.first.delete
Comment.first.restore

最後に

間違いなどございましたら、ご指摘ください。

1
2
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
1
2