He estado leyendo sobre el uso de las inquietudes del modelo para adelgazar los modelos de grasa, así como SECAR los códigos de su modelo. Aquí hay una explicación con ejemplos:
1) SECADO de códigos de modelo
Considere un modelo de artículo, un modelo de evento y un modelo de comentario. Un artículo o un evento tiene muchos comentarios. Un comentario pertenece al artículo o al evento.
Tradicionalmente, los modelos pueden verse así:
Modelo de comentario:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Modelo de artículo:
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 notar, hay un código significativo común tanto para Evento como para Artículo. Usando preocupaciones, podemos extraer este código común en un módulo separado Comentario.
Para esto, cree un archivo commentable.rb en app / models / preocupaciones.
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
Y ahora tus modelos se ven así:
Modelo de comentario:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Modelo de artículo:
class Article < ActiveRecord::Base
include Commentable
end
Modelo de evento:
class Event < ActiveRecord::Base
include Commentable
end
2) Modelos de grasa que aligeran la piel.
Considere un modelo de evento. Un evento tiene muchos asistentes y comentarios.
Por lo general, el modelo de evento podría verse así
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
Los modelos con muchas asociaciones y, de lo contrario, tienden a acumular más y más código y se vuelven inmanejables. Las preocupaciones proporcionan una manera de personalizar los módulos de grasa, haciéndolos más modularizados y fáciles de entender.
El modelo anterior se puede refactorizar usando preocupaciones como a continuación: Crear una attendable.rb
y commentable.rb
archivo en modelos / preocupaciones carpeta de eventos app / /
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
Y ahora usando Preocupaciones, su modelo de Evento se reduce a
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Durante el uso de las preocupaciones, es recomendable optar por la agrupación basada en 'dominio' en lugar de la agrupación 'técnica'. La agrupación basada en el dominio es como 'Commentable', 'Photoable', 'Attendable'. La agrupación técnica significará 'ValidationMethods', 'FinderMethods', etc.