J'ai lu comment utiliser les préoccupations des modèles pour maquiller les modèles gras et sécher vos codes de modèle. Voici une explication avec des exemples:
1) SÉCHAGE des codes modèles
Prenons un modèle d'article, un modèle d'événement et un modèle de commentaire. Un article ou un événement a de nombreux commentaires. Un commentaire appartient à un article ou à un événement.
Traditionnellement, les modèles peuvent ressembler à ceci:
Modèle de commentaire:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Modèle d'article:
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
Modèle d'événement
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
Comme nous pouvons le remarquer, il existe un morceau de code important commun à la fois à l'événement et à l'article. En utilisant des préoccupations, nous pouvons extraire ce code commun dans un module séparé Commentable.
Pour cela, créez un fichier commentable.rb dans app / models / préoccupations.
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
Et maintenant, vos modèles ressemblent à ceci:
Modèle de commentaire:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Modèle d'article:
class Article < ActiveRecord::Base
include Commentable
end
Modèle d'événement:
class Event < ActiveRecord::Base
include Commentable
end
2) Modèles Fat Skin-nizing.
Prenons un modèle d'événement. Un événement a de nombreux participants et commentaires.
En règle générale, le modèle d'événement peut ressembler à ceci
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
Les modèles avec de nombreuses associations et autrement ont tendance à accumuler de plus en plus de code et à devenir ingérables. Les préoccupations fournissent un moyen de skin-nize les modules adipeux les rendant plus modularisés et faciles à comprendre.
Le modèle ci-dessus peut être refactorisé en utilisant les préoccupations comme ci-dessous: Créez un fichier attendable.rb
et commentable.rb
dans le dossier app / models / concern / event
attendable.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
Et maintenant, en utilisant Préoccupations, votre modèle d'événement se réduit à
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Lors de l'utilisation, il est préférable d'opter pour un groupement basé sur un domaine plutôt que sur un groupement «technique». Le regroupement basé sur le domaine est comme «Commentable», «Photoable», «Attendable». Le regroupement technique signifie «ValidationMethods», «FinderMethods», etc.