[ruby-on-rails] Comment utiliser les préoccupations dans Rails 4


2 Answers

J'ai lu à propos de l'utilisation des préoccupations de modèles pour skin-nize modèles de graisse ainsi que sécher vos codes de modèle. Voici une explication avec des exemples:

1) Séchage des codes modèles

Considérons un modèle d'article, un modèle d'événement et un modèle de commentaire. Un article ou un événement a beaucoup de 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 y a un morceau significatif de code commun à la fois à l'événement et à l'article. En utilisant les 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 / concerns.

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 de graisse de nidation de peau.

Considérez 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 deviennent ingérables. Les préoccupations fournissent un moyen de skin-nize modules de graisse, ce qui les rend plus modulaire et facile à comprendre.

Le modèle ci-dessus peut être remodelé en utilisant les préoccupations suivantes: Créer un fichier attendable.rb et un fichier commentable.rb dans le dossier app / models / concerns / event

attenable.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 Concerns, votre modèle d'événement réduit à

class Event < ActiveRecord::Base
  include Commentable
  include Attendable
end

* Lors de l'utilisation, il est conseillé d'opter pour un regroupement basé sur le domaine plutôt que pour un groupement "technique". Le regroupement basé sur un domaine est similaire à 'Commentable', 'Photoable', 'Attendable'. Le regroupement technique signifiera «ValidationMethods», «FinderMethods», etc.

Question

Le générateur de projet Rails 4 par défaut crée maintenant le répertoire "préoccupations" sous les contrôleurs et les modèles. J'ai trouvé quelques explications sur la façon d'utiliser les problèmes de routage, mais rien sur les contrôleurs ou les modèles.

Je suis assez sûr que cela a à voir avec la "tendance DCI" actuelle dans la communauté et je voudrais essayer.

La question est: comment suis-je censé utiliser cette fonctionnalité, y a-t-il une convention sur la façon de définir la hiérarchie de nommage / classe afin de la faire fonctionner? Comment puis-je inclure une préoccupation dans un modèle ou un contrôleur?




Ce message m'a aidé à comprendre les préoccupations.

# app/models/trader.rb
class Trader
  include Shared::Schedule
end

# app/models/concerns/shared/schedule.rb
module Shared::Schedule
  extend ActiveSupport::Concern
  ...
end



En ce qui concerne faire le fichier filename.rb

Par exemple, je veux dans mon application où l'attribut create_by existe mettre à jour sa valeur par 1, et 0 par update_by

module TestConcern 
  extend ActiveSupport::Concern

  def checkattributes   
    if self.has_attribute?(:created_by)
      self.update_attributes(created_by: 1)
    end
    if self.has_attribute?(:updated_by)
      self.update_attributes(updated_by: 0)
    end
  end

end

après cela inclure dans votre modèle comme ceci:

class Role < ActiveRecord::Base
  include TestConcern
end





Related