Лучшая практика: следует ли использовать AR-модель или глобальный хэш для статических данных?

Я думаю о социальной сети. Моя пользовательская модель должна иметь атрибут "eyecolor", который можно установить на странице просмотра с выделением/выпадающим списком.

Мой вопрос: - > должен ли я создать AR-модель или использовать глобальную Hash/Constant для данных? Существует ли наилучшая практика для "статических моделей"?

И как мне связать следующее без AR-модели с отношениями:

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

Мне нужна строка eyecolor:

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

Спасибо, Извините за мой плохой английский!

Ответы

Ответ 1

Вы можете создать модель для обработки логики цвета глаз:

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

   attr_accessor :color

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

end

Примечание. Эта модель не является моделью Active Record, но она создает абстракцию объекта реального мира, который вы пытаетесь моделировать.

EDIT: Мне также нравится этот подход, а не глобальный хеш, потому что он позволяет организовать ваше статическое определение в EyeColor вместо того, чтобы плавать в вашей программе, что дает понять, где это определение.

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

EDIT: добавлен вопросительный знак к методу предикатов.

Ответ 2

То, что вы хотите, это константа. Я помещаю их в файл в config/initializers/constants.rb; таким образом они все находятся в одном и том же месте.

EyeColors = %w{Blue Brown Hazel Green}

В вашей форме просто выполните:

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

Ответ 3

Если у вас есть данные, вы должны поместить их в базу данных. Это не означает, что вы должны загружать его каждый раз, когда используете его:

class EyeColor < ActiveRecord::Base
  has_many :users

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

Вы получаете доступ к этому как EyeColor.allowed_eye_colors. Он загружается при первом использовании, а затем кэшируется в переменной класса.

Ответ 4

Возможно, вы захотите проверить constant_cache. Хранение этой информации в БД, но ее кеширование позволяет добавлять/удалять константы (в дБ) без изменения вашего фактического кода.