Entonces lo descubrí por mí mismo. En realidad es un concepto bastante simple pero poderoso. Tiene que ver con la reutilización del código como en el siguiente ejemplo. Básicamente, la idea es extraer fragmentos de código comunes y / o específicos del contexto para limpiar los modelos y evitar que se vuelvan demasiado gordos y desordenados.
Como ejemplo, pondré un patrón bien conocido, el patrón etiquetable:
# app/models/product.rb
class Product
include Taggable
...
end
# app/models/concerns/taggable.rb
# notice that the file name has to match the module name
# (applying Rails conventions for autoloading)
module Taggable
extend ActiveSupport::Concern
included do
has_many :taggings, as: :taggable
has_many :tags, through: :taggings
class_attribute :tag_limit
end
def tags_string
tags.map(&:name).join(', ')
end
def tags_string=(tag_string)
tag_names = tag_string.to_s.split(', ')
tag_names.each do |tag_name|
tags.build(name: tag_name)
end
end
# methods defined here are going to extend the class, not the instance of it
module ClassMethods
def tag_limit(value)
self.tag_limit_value = value
end
end
end
Entonces, siguiendo la muestra del Producto, puede agregar Taggable a cualquier clase que desee y compartir su funcionalidad.
DHH lo explica muy bien :
En Rails 4, vamos a invitar a los programadores a utilizar las preocupaciones con los directorios predeterminados de la aplicación / modelos / preocupaciones y la aplicación / controladores / preocupaciones que son automáticamente parte de la ruta de carga. Junto con el envoltorio ActiveSupport :: Concern, es suficiente soporte para hacer que este mecanismo de factorización liviano brille.
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:
Modelo de artículo:
Modelo de evento
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.
Y ahora tus modelos se ven así:
Modelo de comentario:
Modelo de artículo:
Modelo de evento:
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í
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
ycommentable.rb
archivo en modelos / preocupaciones carpeta de eventos app / /attendable.rb
commentable.rb
Y ahora usando Preocupaciones, su modelo de Evento se reduce a
* 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.
fuente
def self.my_class_method
), métodos de instancia y llamadas a métodos y directivas en el ámbito de la clase. No hay necesidad demodule ClassMethods
add_item
, por ejemplo, estás jodido. Recuerdo que pensé que Rails estaba roto cuando algunos validadores dejaron de funcionar, pero alguien lo había implementadoany?
en una preocupación. Propongo una solución diferente: use la preocupación como una interfaz en un idioma diferente. En lugar de definir la funcionalidad, define la referencia a una instancia de clase separada que maneja esa funcionalidad. Entonces tienes clases más pequeñas y ordenadas que hacen una cosa ...Vale la pena mencionar que el uso de preocupaciones es considerado una mala idea por muchos.
Algunos motivos:
include
método de parcheo , hay un sistema completo de manejo de dependencias, demasiada complejidad para algo que es un trivial buen patrón de mezcla Ruby.Las preocupaciones son una manera fácil de dispararte en la pierna, ten cuidado con ellas.
fuente
Esta publicación me ayudó a entender las preocupaciones.
fuente
Sentí que la mayoría de los ejemplos aquí demostraban el poder en
module
lugar de cómoActiveSupport::Concern
agrega valormodule
.Ejemplo 1: módulos más legibles.
Entonces, sin preocupaciones, esto
module
será lo típico .Después de refactorizar con
ActiveSupport::Concern
.Verá que los métodos de instancia, los métodos de clase y el bloque incluido son menos desordenados. Las preocupaciones los inyectarán de manera apropiada para usted. Esa es una ventaja de usar
ActiveSupport::Concern
.Ejemplo 2: manejar las dependencias del módulo con gracia.
En este ejemplo
Bar
es el módulo queHost
realmente necesita. Pero comoBar
tiene dependencia conFoo
laHost
clase tiene que hacerloinclude Foo
(pero espere ¿por quéHost
quiere saberFoo
? ¿Se puede evitar?).Entonces
Bar
agrega dependencia donde quiera que vaya. Y el orden de inclusión también es importante aquí. Esto agrega mucha complejidad / dependencia a la enorme base de código.Después de refactorizar con
ActiveSupport::Concern
Ahora se ve simple.
Si está pensando, ¿por qué no podemos agregar
Foo
dependencia en elBar
propio módulo? Eso no funcionará, yamethod_injected_by_foo_to_host_klass
que debe inyectarse en una clase que no está incluidaBar
en elBar
módulo.Fuente: Rails ActiveSupport :: Preocupación
fuente
En preocupaciones, haga el archivo filename.rb
Por ejemplo, quiero en mi aplicación donde el atributo create_by existe, actualice su valor en 1 y 0 para updated_by
Si quieres pasar argumentos en acción
después de eso incluye en tu modelo así:
fuente