He leído un poco sobre cómo extender ActiveRecord: Clase base para que mis modelos tengan algunos métodos especiales. ¿Cuál es la manera fácil de extenderlo (tutorial paso a paso)?
ruby-on-rails
extend
rails-activerecord
xpepermint
fuente
fuente
Respuestas:
Hay varios enfoques:
Usando ActiveSupport :: Preocupación (Preferido)
Lea la documentación de ActiveSupport :: Concern para obtener más detalles.
Cree un archivo llamado
active_record_extension.rb
en ellib
directorio.Cree un archivo en el
config/initializers
directorio llamadoextensions.rb
y agregue la siguiente línea al archivo:Herencia (preferida)
Consulte la respuesta de Toby .
Mono parcheado (debe evitarse)
Cree un archivo en el
config/initializers
directorio llamadoactive_record_monkey_patch.rb
.La famosa cita sobre las expresiones regulares de Jamie Zawinski se puede cambiar de propósito para ilustrar los problemas asociados con el parcheado de monos.
El parcheado de monos es fácil y rápido. Pero, el tiempo y el esfuerzo ahorrados siempre se extraen en algún momento en el futuro; con interés compuesto En estos días limito los parches de mono para crear rápidamente una solución prototipo en la consola de rails.
fuente
require
archivo al final deenvironment.rb
. He agregado este paso adicional a mi respuesta.ImprovedActiveRecord
y heredar de ella, cuando está usandomodule
, está actualizando la definición de la clase en cuestión. Solía usar la herencia (causa de años de experiencia en Java / C ++). En estos días uso principalmente módulos.Refinements
que aborda la mayoría de los problemas con parches de mono ( yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice ). A veces hay una función que solo te obliga a tentar al destino. Y a veces lo haces.Simplemente puede extender la clase y simplemente usar la herencia.
fuente
abstract_models
. ¿Dónde debería ponerlo?self.abstract_class = true
a tuAbstractModel
. Rails ahora reconocerá el modelo como un modelo abstracto.AbstractModel
en la base de datos. ¡Quién sabía que un setter simple me ayudaría a SECAR las cosas! (Estaba empezando a encogerme ... era malo). Gracias Toby y Harish!También puede usar
ActiveSupport::Concern
y ser más Rails core idiomático como:[Editar] siguiendo el comentario de @daniel
Luego, todos sus modelos tendrán el método
foo
incluido como método de instancia y los métodosClassMethods
incluidos como métodos de clase. Por ejemplo, en unFooBar < ActiveRecord::Base
tendrá:FooBar.bar
yFooBar#foo
http://api.rubyonrails.org/classes/ActiveSupport/Concern.html
fuente
InstanceMethods
está en desuso desde Rails 3.2, solo ponga sus métodos en el cuerpo del módulo.ActiveRecord::Base.send(:include, MyExtension)
en un inicializador y luego esto funcionó para mí. Rails 4.1.9Con Rails 4, el concepto de utilizar las preocupaciones para modularizar y SECAR sus modelos ha sido destacado.
Las preocupaciones básicamente le permiten agrupar un código similar de un modelo o en varios modelos en un solo módulo y luego usar este módulo en los modelos. Aquí hay un ejemplo:
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 a un artículo o 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 el Modelo de Evento como para el 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 / model / concern
Y ahora tus modelos se ven así:
Modelo de comentario:
Modelo de artículo:
Modelo de evento
Un punto que me gustaría destacar al usar Preocupaciones es que las Preocupaciones deben usarse para la agrupación 'basada en el dominio' en lugar de la agrupación 'técnica'. Por ejemplo, una agrupación de dominio es como 'Commentable', 'Etiquetable', etc. Una agrupación de base técnica será como 'FinderMethods', 'ValidationMethods'.
Aquí hay un enlace a una publicación que encontré muy útil para comprender las preocupaciones en Modelos.
Espero que la redacción ayude :)
fuente
Paso 1
Paso 2
Paso 3
fuente
Los rieles 5 proporcionan un mecanismo incorporado para extender
ActiveRecord::Base
.Esto se logra al proporcionar una capa adicional:
y todos los modelos heredan de ese:
Ver, por ejemplo, este blog .
fuente
Solo para agregar a este tema, pasé un tiempo resolviendo cómo probar tales extensiones (seguí la
ActiveSupport::Concern
ruta).Así es como configuro un modelo para probar mis extensiones.
fuente
Con Rails 5, todos los modelos se heredan de ApplicationRecord y es una buena manera de incluir o ampliar otras bibliotecas de extensiones.
Suponga que el módulo de métodos especiales necesita estar disponible en todos los modelos, inclúyalo en el archivo application_record.rb. Si queremos aplicar esto para un conjunto particular de modelos, entonces inclúyalo en las clases de modelo respectivas.
Si desea tener los métodos definidos en el módulo como métodos de clase, extienda el módulo a ApplicationRecord.
¡Espero que ayude a otros!
fuente
yo tengo
en un inicializador
Para un módulo como el siguiente
fuente