2009-03-05 6 views
13

Estoy pensando en un sitio de redes sociales. Mi modelo de usuario debería tener un atributo "color de ojos", que podría establecerse en una página de visualización con un cuadro de selección/lista desplegable.Práctica recomendada: ¿debo usar un modelo AR o un hash global para datos estáticos?

Mi pregunta: -> ¿Debería hacer un modelo AR o debería usar un hash/constante global para los datos? ¿Existe una mejor práctica para los "modelos estáticos"?

Y ¿Cómo asocio siguiente sin un AR-Modelo con las relaciones:

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

Lo que necesito es el color de ojos cuerdas:

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

Gracias, siento por mi mala Inglés!

Respuesta

8

Se puede crear un modelo para manejar la lógica de su color de ojos:

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

    attr_accessor :color 

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

end 

Nota: este modelo no es un modelo Active Record, pero crea una abstracción del objeto del mundo real que está intentando modelo.

EDITAR: También me gusta este enfoque en comparación con un hash global, porque le da organiza su definición estática dentro de EyeColor en lugar de flotar en su programa, lo que deja en claro dónde está esta definición.

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

EDIT: added question mark to predicate method.

+0

Lo bueno de este enfoque en particular es que tienes la oportunidad de seguir adelante si crees que la abstracción es mayor que una simple búsqueda. Esencialmente, el refactor se convierte en una cuestión de agregar un par de métodos o hacer que la clase herede de AR. – robertpostill

+0

Me gusta mucho esta idea, pero tengo problemas para encontrar un código que funcione para mí. En mi sitio, quiero permitir que el administrador cambie el nombre del sitio (SITE_NAME) y lo almacene en el DB. Sin embargo, creo que es excesivo recuperar SITE_NAME cada vez que necesito mostrar una página. ¿Podría dar un poco más de detalles sobre la sección "Algunos métodos lógicos ..." de su respuesta? :) Gracias! Richard –

+0

http://pastie.org/482993 Me he burlado de algunos códigos aquí.¿Esto parece viable o estoy viajando por el camino equivocado? –

5

Lo que quiere es una constante. Los puse en un archivo en config/initializers/constants.rb; de esa forma todos están en el mismo lugar.

EyeColors = %w{Blue Brown Hazel Green} 

En su forma Just Do:

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

Es posible que desee comprobar en constant_cache. Almacenar esta información en el DB, pero tenerla en caché le permite agregar/eliminar constantes (en el db) sin cambiar su código real.

4

Si tiene algunos datos, debe ponerlos en la base de datos. Esto no significa que tenga que cargarlo cada vez que lo use:

class EyeColor < ActiveRecord::Base 
    has_many :users 

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

Puede acceder a este como EyeColor.allowed_eye_colors. Se carga la primera vez que lo usas y luego se almacena en caché en la variable de clase.

+1

Dio un voto positivo por esto un año después. Me gusta más que mi propia respuesta. –

Cuestiones relacionadas