モデルの懸念を使用して、脂肪モデルをスキンナイズし、モデルコードをドライアップすることについて読んでいます。以下に例を挙げて説明します。
1) モデルコードのドライアップ
Article モデル、Event モデル、Comment モデルを考えてみましょう。記事やイベントには多くのコメントがあります。コメントは記事またはイベントのいずれかに属します。
伝統的に、モデルは次のようになります。
コメント モデル:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
記事のモデル:
class Article < ActiveRecord::Base
has_many :comments, as: :commentable
def find_first_comment
comments.first(created_at DESC)
end
def self.least_commented
#return the article with least number of comments
end
end
イベントモデル
class Event < ActiveRecord::Base
has_many :comments, as: :commentable
def find_first_comment
comments.first(created_at DESC)
end
def self.least_commented
#returns the event with least number of comments
end
end
お気づきのように、Event と Article の両方に共通する重要なコードがあります。懸念を使用して、この共通コードを別のモジュール Commentable に抽出できます。
このために、app/models/concerns に commentable.rb ファイルを作成します。
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments, as: :commentable
end
# for the given article/event returns the first comment
def find_first_comment
comments.first(created_at DESC)
end
module ClassMethods
def least_commented
#returns the article/event which has the least number of comments
end
end
end
そして今、あなたのモデルは次のようになります:
コメント モデル:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
記事のモデル:
class Article < ActiveRecord::Base
include Commentable
end
イベント モデル:
class Event < ActiveRecord::Base
include Commentable
end
2) スキンナイズ脂肪モデル。
イベントモデルを考えてみましょう。イベントには多くの出席者とコメントがあります。
通常、イベント モデルは次のようになります。
class Event < ActiveRecord::Base
has_many :comments
has_many :attenders
def find_first_comment
# for the given article/event returns the first comment
end
def find_comments_with_word(word)
# for the given event returns an array of comments which contain the given word
end
def self.least_commented
# finds the event which has the least number of comments
end
def self.most_attended
# returns the event with most number of attendes
end
def has_attendee(attendee_id)
# returns true if the event has the mentioned attendee
end
end
多くの関連付けを持つモデルや、それ以外の場合は、ますます多くのコードが蓄積されて管理不能になる傾向があります。懸念は、脂肪モジュールをスキンナイズして、よりモジュール化して理解しやすくする方法を提供します。
上記のモデルは、次のように懸念事項を使用してリファクタリングできます: app/models/concerns/event フォルダにattendable.rb
andファイルを作成します。commentable.rb
出席可能な.rb
module Attendable
extend ActiveSupport::Concern
included do
has_many :attenders
end
def has_attender(attender_id)
# returns true if the event has the mentioned attendee
end
module ClassMethods
def most_attended
# returns the event with most number of attendes
end
end
end
commentable.rb
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments
end
def find_first_comment
# for the given article/event returns the first comment
end
def find_comments_with_word(word)
# for the given event returns an array of comments which contain the given word
end
module ClassMethods
def least_commented
# finds the event which has the least number of comments
end
end
end
そして今、懸念を使用すると、イベントモデルは次のように縮小されます
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
*懸念事項を使用している間は、「技術的」グループ化ではなく「ドメイン」ベースのグループ化を行うことをお勧めします。ドメインベースのグループ化は、「コメント可能」、「写真可能」、「参加可能」のようなものです。技術的なグループ化は、「ValidationMethods」、「FinderMethods」などを意味します