¿Dónde pongo las matemáticas en una aplicación de rieles?

Cada módulo (o clase) debe tener un solo
preocupación. No lo ponga en el modelo, la única preocupación que debe tener un modelo es representar los datos en la base de datos.

Entonces, sí, póngalo en lib /

Calcular :: EarningsPerShare.for (ganancias: ganancias, acciones: acciones) le servirá mucho mejor ahora y en el futuro, y será más fácil de probar que model.earnings_per_share.

Pase siempre los valores explícitamente. Evite la tentación de pasar el modelo y extraiga los valores requeridos. Siga acoplando BAJO, y su código seguirá siendo simple.

Muchas clases pequeñas son la clave para un código bien estructurado y fácil de mantener. Después de tenerlos, es fácil agregar un método de conveniencia al modelo que delegue a la clase de responsabilidad única y no hinche el modelo.

Recuerde siempre utilizar las columnas BigDecinal y Decimal DB cuando trabaje con datos financieros.

¿Tiene un modelo para los datos financieros? Por ejemplo, supongamos que está obteniendo información de acciones de una compañía de Yahoo. Puede tener un modelo de Compañía y Precio de Acciones. Entonces, después de obtener Yahoo, creará / actualizará los modelos de precios de acciones y compañías.

Para sus matemáticas, también puede tenerlo en los modelos. El modelo de compañía puede tener algunos métodos de relación que se derivan y calculan a partir del precio de las acciones.

También está bien tenerlos en lib y luego incluirlos en sus modelos para que pueda compartir el código. Otra alternativa es convertirlos en preocupaciones de ActiveRecord. El controlador definitivamente no es el lugar correcto para ponerlo.

Esto debería ayudarte: Patrones de diseño y refactorización