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

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

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

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

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

Мне нужна строчка для глаз:

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

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

Ответы [ 4 ]

8 голосов
/ 05 марта 2009

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

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

   attr_accessor :color

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

end

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

РЕДАКТИРОВАТЬ: Мне также нравится этот подход, в отличие от глобального хеша, потому что он дает вам возможность организовать ваше статическое определение в EyeColor вместо того, чтобы перемещаться в вашей программе, что проясняет, где это определение.

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

РЕДАКТИРОВАТЬ: добавлен знак вопроса в метод предиката.

5 голосов
/ 05 марта 2009

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

EyeColors = %w{Blue Brown Hazel Green}

В вашей форме просто сделайте:

<%= f.select :eye_color, EyeColors %>
4 голосов
/ 05 марта 2009

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

class EyeColor < ActiveRecord::Base
  has_many :users

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

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

0 голосов
/ 05 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...