Eu tenho lido sobre o uso de preocupações com modelos para modelar modelos de gordura, bem como secar os códigos de seus modelos. Aqui está uma explicação com exemplos:
1) SECAGEM de códigos de modelo
Considere um modelo de artigo, um modelo de evento e um modelo de comentário. Um artigo ou evento tem muitos comentários. Um comentário pertence ao Artigo ou Evento.
Tradicionalmente, os modelos podem ser assim:
Modelo de comentário:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Artigo Modelo:
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
Modelo de Evento
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
Como podemos observar, há um pedaço significativo de código comum ao Evento e ao Artigo. Usando preocupações, podemos extrair esse código comum em um módulo separado.
Para isso, crie um arquivo commentable.rb em app / models / preocupações.
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
E agora seus modelos ficam assim:
Modelo de comentário:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Artigo Modelo:
class Article < ActiveRecord::Base
include Commentable
end
Modelo de Evento:
class Event < ActiveRecord::Base
include Commentable
end
2) Modelos de gordura que desnaturam a pele.
Considere um modelo de evento. Um evento tem muitos participantes e comentários.
Normalmente, o modelo de evento pode ter esta aparência
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
Modelos com muitas associações e de outra forma tendem a acumular cada vez mais códigos e se tornam incontroláveis. As preocupações fornecem uma maneira de reduzir o tamanho dos módulos de gordura, tornando-os mais modulares e fáceis de entender.
O modelo acima pode ser refatorado usando as preocupações conforme abaixo: Crie um arquivo attendable.rb
e commentable.rb
na pasta app / models / preocupações / evento
Attable.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
E agora, usando o Preocupações, seu modelo de evento se reduz a
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Enquanto estiver usando preocupações, é aconselhável optar pelo agrupamento baseado em 'domínio' em vez de agrupamento 'técnico'. O agrupamento baseado em domínio é como 'Comentável', 'Fotoable', 'Attendable'. Agrupamento técnico significa 'ValidationMethods', 'FinderMethods' etc.