Лучшая практика: следует ли использовать 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. Хранение этой информации в БД, но ее кеширование позволяет добавлять/удалять константы (в дБ) без изменения вашего фактического кода.