Ho letto sull'uso delle preoccupazioni dei modelli per skin-nize dei modelli di grasso e per ASCIUGARE i codici del modello. Ecco una spiegazione con esempi:
1) ASCIUGATURA dei codici modello
Considera un modello di articolo, un modello di evento e un modello di commento. Un articolo o un evento ha molti commenti. Un commento appartiene all'articolo o all'evento.
Tradizionalmente, i modelli possono apparire così:
Modello di commento:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Modello dell'articolo:
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
Modello di 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
Come possiamo notare, esiste una parte significativa del codice comune sia all'evento che all'articolo. Usando le preoccupazioni possiamo estrarre questo codice comune in un modulo separato Commentable.
Per questo crea un file commentable.rb in app / modelli / preoccupazioni.
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 ora i tuoi modelli si presentano così:
Modello di commento:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Modello dell'articolo:
class Article < ActiveRecord::Base
include Commentable
end
Modello di evento:
class Event < ActiveRecord::Base
include Commentable
end
2) Modelli di grasso per la pelle.
Prendi in considerazione un modello di evento. Un evento ha molti partecipanti e commenti.
In genere, il modello di eventi potrebbe apparire così
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
Modelli con molte associazioni e altrimenti hanno la tendenza ad accumulare sempre più codice e diventare ingestibili. Le preoccupazioni forniscono un modo per skin-nize i moduli fat rendendoli più modularizzati e di facile comprensione.
Il modello sopra può essere refactored usando i problemi come di seguito: Crea un file attendable.rb
e commentable.rb
nella cartella app / modelli / preoccupazioni / eventi
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
E ora usando Preoccupazioni, il tuo modello Evento si riduce a
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Durante l'utilizzo delle preoccupazioni è consigliabile scegliere un raggruppamento basato su "dominio" anziché raggruppamento "tecnico". Il raggruppamento basato sul dominio è come "Commentable", "Photoable", "Attendable". Raggruppamento tecnico significa "Metodi di convalida", "Metodi di ricerca" ecc