Quindi sto scrivendo un oggetto modulo che si occupa di una cosa specifica - il prezzo - che sarà incluso in diverse risorse sottostanti. (Il prezzo è un modello separato che può o non può essere necessario creare / aggiornare con la risorsa sottostante che belongs_to
, questo 'oggetto modulo prezzi' gestisce questa logica).
Si popola in tre modi diversi:
-
Quando istanziato per mostrare un modulo
edit
per una risorsa esistente, si popola usando i dati dalla risorsa. -
Quando istanziato per mostrare un modulo
new
per una risorsa non ancora esistente, si popola automaticamente con alcune impostazioni predefinite. -
Quando viene istanziato per salvare un modulo (su
create
oupdate
), si popola con i parametri del modulo.
Quindi, leggermente semplificato:
def initialize(resource: nil, params: {})
@resource = resource
if params.empty?
resource.price.nil? ? set_defaults : set_from_resource
else
set_from_params(params)
end
end
Funziona bene. Ed è bello e ASCIUTTO - la maggior parte della logica può essere condivisa tra i tre casi.
Ma ... sembra un po 'strano, sai? Avere un singolo oggetto si popola in molti modi diversi a seconda del compito che deve svolgere. Non è un modello che ho visto molto altrove, il che mi preoccupa se c'è una ragione per questo.
Una possibile cosa sarebbe dividerlo in un oggetto modulo e un oggetto servizio prezzo. Ma questo non sembra che possa risolvere il problema. Per prima cosa, non posso fare in modo che l'oggetto form si popoli solo dalla risorsa (lasciando che il servizio populi dai parametri e salvi nella risorsa), poiché l'oggetto form deve essere compilato dai parametri nel caso di un errore salva, poiché il modulo viene nuovamente visualizzato. Per un altro, l'oggetto modulo ha bisogno di accedere a qualsiasi errore impostato sul modello Prezzo in fase di salvataggio, quindi può mostrarlo all'utente - che è semplice al momento (posso clonare gli errori dal modello di prezzo all'oggetto del modulo) , ma con un oggetto di servizio Price l'oggetto modulo dovrà richiederne gli errori. O duplicherò gran parte della logica, o i due oggetti finiranno così strettamente accoppiati che sarebbe stato inutile separarli.
C'è uno schema che mi manca che risolva in modo elegante? O dovrei smettere di preoccuparmi di popolare un oggetto in molti modi diversi?