Leo en todas partes que la lógica comercial pertenece a los modelos y no al controlador, pero ¿dónde está el límite? Estoy jugando con una aplicación de contabilidad personal.¿Los modelos de rieles deberían preocuparse por otros modelos en aras de los controladores delgados?
Account
Entry
Operation
Al crear una operación sólo es válido si se crean y vinculadas a las cuentas de manera que la operación es equilibrado para exemple las entradas correspondientes comprar un paquete de 6:
o=Operation.new({:description=>"b33r", :user=>current_user, :date=>"2008/09/15"})
o.entries.build({:account_id=>1, :amount=>15})
o.valid? #=>false
o.entries.build({:account_id=>2, :amount=>-15})
o.valid? #=>true
Ahora la forma mostrada para el usuario en el caso de operaciones básicas se simplifica para ocultar los detalles de las entradas, las cuentas se seleccionan entre 5 por defecto por el tipo de operación solicitada por el usuario (cuenta inicial -> patrimonio para contabilizar, gastar activos -> gastos , gana ingresos-> activos, endeudamientos-> activos, paga activos de deuda-> pasivos ...) Quiero las entradas creadas a partir de los valores predeterminados.
También quiero ser capaz de crear operaciones más complejas (más de 2 entradas). Para este segundo caso de uso tendré una forma diferente en la que se expondrá la complejidad adicional. Este segundo caso de uso me impide incluir un campo de débito y crédito en la Operación y deshacerme del enlace de Entrada.
¿Cuál es la mejor forma? Usando el código anterior en un SimpleOperationController como lo hago por el momento, o definiendo un nuevo método en la clase Operation para poder llamar Operation.new_simple_operation (params [: operation])
¿No está rompiendo la separación de preocupaciones? para realmente crear y manipular objetos de entrada de la clase de Operación?
No estoy buscando consejo sobre mis principios de contabilidad retorcidos :)
edición - Parece que no me expreso con demasiada claridad. No estoy tan preocupado por la validación. Me preocupa más dónde debe ir el código lógico de creación:
asumiendo que la operación en el controlador se denomina gasto, al usar gasto, el hash de parámetros contendrá: cantidad, fecha, descripción. Las cuentas de débito y crédito se derivarían de la acción que se llama, pero luego tengo que crear todos los objetos. ¿Sería mejor tener
#error and transaction handling is left out for the sake of clarity
def spend
amount=params[:operation].delete(:amount)#remove non existent Operation attribute
op=Operation.new(params[:operation])
#select accounts in some way
...
#build entries
op.entries.build(...)
op.entries.build(...)
op.save
end
o para crear un método de operación que haría que el aspecto anterior como
def spend
op=Operation.new_simple_operation(params)
op.save
end
esto sin duda dará un controlador mucho más delgada y un modelo más gordos, pero entonces el modelo creará y almacenará instancias de otros modelos, que es donde está mi problema.
Originalmente acepté su respuesta pero asume que los parámetros para las entradas están definidos, que no es el caso. Entonces tendría que crear los parámetros correctos en el controlador que es lo mismo que crear los objetos :) pero su truco será útil en otros lugares y se fijará en los raíles 2.2 si el IRRC – Jean