2009-03-05 7 views
13

Sto pensando a un sito di social networking. Il mio modello utente dovrebbe avere un attributo "eyecolor", che potrebbe essere impostato su una pagina di visualizzazione con una casella di selezione/elenco a discesa.Best practice: dovrei utilizzare un modello AR o un hash globale per dati statici?

La mia domanda: -> dovrei creare un modello AR o dovrei usare un hash/costante globale per i dati? Esiste una best practice per "modelli statici"?

e come posso associare a seguito senza un AR-Modello con le relazioni:

u = User.first 
u.eyecolor 
==> 1 (not the eyecolor-string!) 

cosa ho bisogno è il colore degli occhi-stringa:

u = User.first 
u.eyecolor 
==> "brown" 

Grazie, dispiace per il mio cattivo inglese!

risposta

8

Si potrebbe creare un modello per gestire la logica colore degli occhi:

class EyeColor 
    COLORS = ['blue','brown','hazel'] 

    attr_accessor :color 

    # Some logic methods... 
    def is_brown? 
    self.color == 'brown' 
    end 

end 

Nota: questo modello non è un modello di Active Record, ma lo fa creare un'astrazione l'oggetto del mondo reale si sta cercando di modello.

EDIT: Mi piace anche questo approccio rispetto a un hash globale, perché consente di organizzare la definizione statica in EyeColor invece di fluttuare nel programma, il che rende chiaro dove si trova questa definizione.

<%= select :user, :eye_color, EyeColor::COLORS %> 

MODIFICA: aggiunto il punto di domanda per indicare il metodo.

+0

L'altra cosa bella di questo particolare approccio è che hai l'opportunità di andare avanti se trovi che l'astrazione diventa maggiore di una semplice ricerca. In sostanza, il refattore diventa questione di aggiungere un paio di metodi o di ereditare la classe da AR. – robertpostill

+0

Mi piace molto questa idea, ma sto avendo problemi a venire con il codice che funziona per me. Nel mio sito voglio consentire all'amministratore di cambiare il nome del sito (SITE_NAME) e memorizzarlo nel DB. Tuttavia, penso che sia eccessivo cercare di recuperare SITE_NAME ogni volta che ho bisogno di visualizzare una pagina. Potresti dare un po 'più di dettaglio sulla sezione "Alcuni metodi logici ..." della tua risposta? :) Grazie! Richard –

+0

http://pastie.org/482993 Ho deriso qualche codice qui.Questo aspetto funziona o sto viaggiando lungo la strada sbagliata? –

5

Quello che vuoi è una costante. Li ho inseriti in un file in config/initializers/constants.rb; in questo modo sono tutti nello stesso posto.

EyeColors = %w{Blue Brown Hazel Green} 

Nel modulo basta fare:

<%= f.select :eye_color, EyeColors %> 
0

Si potrebbe desiderare di controllare in constant_cache. Memorizzando queste informazioni nel DB, ma averlo memorizzato nella cache consente di aggiungere/rimuovere costanti (nel db) senza modificare il codice effettivo.

4

Se si dispone di alcuni dati, è necessario inserirlo nel database. Questo non significa che devi caricarlo ogni volta che si utilizza:

class EyeColor < ActiveRecord::Base 
    has_many :users 

    def self.allowed_eye_colors 
    @@eye_colors ||= AllowedEyeColor.find(:all) 
    end 
end 

Per accedere a questa come EyeColor.allowed_eye_colors. Viene caricato la prima volta che viene utilizzato e quindi memorizzato nella variabile di classe.

+1

Ha dato un voto per questo un anno dopo. Mi piace meglio della mia risposta. –