J'ai lu sur l'aide de modèle de préoccupations pour la peau-connaître modèles de matières grasses ainsi que de SÉCHER votre modèle de codes. Voici une explication avec des exemples:
1) l'Assèchement des modèles de codes
Considérons un modèle Article, un modèle d'Événement et un Commentaire de Modèle. Un article ou Un événement a de nombreux commentaires. Un commentaire appartient soit de l'article ou de l'événement.
Traditionnellement, les modèles peuvent ressembler à ceci:
Modèle Commentaire:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
L'Article Modèle:
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 on peut le remarquer, il existe un important morceau de code commun aux deux Cas et Modèle de l'Article. À l'aide des préoccupations que nous pouvons extraire de cette commune code dans un module séparé Commentable.
Pour cela créer un commentable.rb fichier app/model/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 ressembler à ceci :
Modèle Commentaire:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
L'Article Modèle:
class Article < ActiveRecord::Base
include Commentable
end
Modèle D'Événement:
class Event < ActiveRecord::Base
include Commentable
end
2) Peau-nizing Modèles de matières Grasses.
Considérons un modèle d'Événement. Un événement a de nombreux auditeurs et les commentaires.
Généralement, le modèle d'événement pourrait 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 ailleurs ont tendance à accumuler plus de et plus de code et de devenir ingérable.Les préoccupations de fournir un moyen pour la peau-connaître la graisse des modules de les rendre plus modulaire et facile à comprendre.
Le modèle ci-dessus peut être reconstruit à l'aide des préoccupations comme ci-dessous:
Créer un attendable.rd et commentable.rb fichier app/model/préoccupation/event dossier
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, à l'aide de Préoccupations , de votre Événement en modèle réduit à
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Lors de l'utilisation des préoccupations de sa conseillé d'y aller pour "domaine" de regroupement en fonction de la plutôt que de la "technique" de regroupement. Domaine en Fonction de regroupement est comme "Commentable', 'Photoable', 'Attendable'. Technique de regroupement signifie 'ValidationMethods', 'FinderMethods", etc