Domanda

È buona norma spostare la logica dal controller nel modello. Ma in qualsiasi sistema complesso, ciò porta inevitabilmente a un file molto grande anche se la maggior parte dei metodi è una linea come da Rails Way.

Ho fatto ricorso alla suddivisione dei modelli in altri moduli e includendoli nel modello originale, ad esempio model_flags , model_validation , ecc. Chiunque ha un modo migliore ?

Modifica: ho selezionato una nuova risposta che mi ha suggerito di utilizzare ActiveConcern. Inoltre, per chiunque sia interessato all'organizzazione del codice, questo articolo, Making ActiveRecord Models Thin , dovrebbe essere di grande aiuto.

È stato utile?

Soluzione

Mi rendo conto che questa è una domanda abbastanza vecchia ed è stata contrassegnata come risposta, ma ha ancora un buon succo di Google, quindi ho pensato che valesse la pena aggiungere a ...

Rails 3 ha introdotto ActiveSupport :: Concern, che può essere utilizzato per modulare il comportamento condiviso tra i modelli. O, del resto, per ridurre i modelli che sono diventati troppo grassi.

Lo stesso DHH fornisce un esempio conciso e conciso qui:

https://gist.github.com/1014971

Altri suggerimenti

Non lo farei per alcuni motivi.

Prima di tutto, si viola il presupposto che le cose saranno dove dovrebbero essere, che è probabilmente il più grande bonus alle rotaie in primo luogo. Una nuova persona può camminare sul tuo progetto e navigarlo abbastanza facilmente se aggiungi elementi del modello al tuo modello. Se lo estrai, aggiungi solo un ritardo e un po 'di confusione, in particolare se l'unica logica per rimuovere qualcosa da un modulo è ridurre le dimensioni del modello.

In secondo luogo non ne guadagni quasi nulla e perdi qualcosa. Le dimensioni dei file non contano in questi giorni quando quasi tutti gli editor e gli IDE alleviano il problema della navigazione di file di grandi dimensioni. Spostare le cose in un modulo in realtà toglie un po 'di questa facilità moderna e richiederà a te e ai tuoi colleghi o futuri manutentori di saltare diversi altri file mentre si lavora su un modello.

Detto questo, ho il sospetto che ciò che ti dirà la migliore pratica dei binari hardcore è che se il tuo modello è così grande e complesso, il tuo design è imperfetto e il tuo modello probabilmente rappresenta diverse cose che potrebbero essere trasformate in modelli separati piuttosto che in moduli .

Beh, non direi che qualcuno di voi ha sbagliato a mettere tutto in un modello, ma penso che sia anche abbastanza valido poter separare varie preoccupazioni. È almeno un compromesso.

E sto pubblicando una risposta alla mia domanda, poiché ho trovato il Rails Way per fare proprio questo: http://github.com/jakehow/concerned_with

Ulteriori informazioni sono disponibili qui: http://m.onkey.org/2008/ 9/15 / active-record di-tips-and-tricks

Non avendo conoscenza del tuo modello a oggetti, è un po 'più difficile consigliarlo, ma direi che se sei assolutamente convinto che tutte le validazioni / associazioni / callback devono essere presenti quel posto, ci sono ancora modi per prendere in considerazione comportamenti comuni. Quindi, anche se non vorrei semplicemente spostare un grosso pezzo di codice da un file a un altro, dove riapre semplicemente la classe, direi che usare moduli / plugin per descrivere tipi comuni di comportamenti è una buona idea.

Ad esempio, se stai costruendo un feed di attività simile a Facebook e tutto ciò che deve generare "eventi", allora potresti voler spostare questo "Eventable" comportamento in un modulo che, se incluso, definisce le associazioni / convalide / ecc. Direi che l'approccio in realtà migliorerebbe la chiarezza del tuo codice, dal momento che specificare manualmente quelle associazioni ovunque non è così espressivo come dichiarare qualcosa come Eventable, né è sicuro (dovresti duplicare la logica in un sacco di posti e quando la logica cambia, conosci il resto ...)

Tutto sommato, direi, dai un'occhiata al tuo modello di oggetti. Nella suite di test, se noti che tutti i test richiedono molta configurazione, questo può essere un buon indicatore del fatto che ti manca qualcosa nel tuo modello di oggetti. Ancora una volta, però, un po 'di codice di esempio sarebbe fantastico.

I moduli sembrano sensibili. Non estrarrei le chiamate di metodo (validazioni, callback, plugin ecc.) In moduli, tuttavia, limiterei l'estrazione ai miei metodi.

E come sempre, sarebbe utile se tu avessi pubblicato del codice di esempio. Trovo difficile immaginare una strategia generica per ripulire i modelli, dipende dalla natura del codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top