モデルを責務ごとに分割するためにconcernsを使用する。
concernsを使用することで、データアクセスとビジネスロジックをその責任の単位でカプセル化できる。
concernsは複数のモデルで使用されるコードをカプセル化することでより威力を発揮するが、ファットモデルを解消する点で一つのモデルでのみ使用されるロジックであっても、concernsを使用することは有効である。
データベースと直接的なやり取りを行わない場合は、PORO(Plain Old Ruby Object)を使用する。
# app/models/concerns/taggable.rb
module Taggable
extend ActiveSupport::Concern
included do
has_many :taggings, as: :taggable, dependent: :destroy
has_many :tags, through: :taggings
end
def tag_names
tags.map(&:name)
end
end
# app/models/post.rb
class Post < ApplicationRecord
include Taggable
# Postモデル固有のロジックや関連付け
belongs_to :user
end
# app/models/video.rb
class Video < ApplicationRecord
include Taggable
# Videoモデル固有のロジック
belongs_to :user
end