Лучшее место для хранения специфических для модели констант в рельсах 3.1? - PullRequest
20 голосов
/ 06 ноября 2011

У меня есть поле type в модели с именем user , которая является целым числом в БД.Значение типа int указывает тип магазина.Пример:

  • 0 = мама
  • 1 = папа
  • 2 = бабушка
  • и т. Д.

У меня есть несколько других подобных полей, поэтому создание ассоциативных таблиц излишне.

Вместо того, чтобы проверять эти значения int по месту в условных выражениях в модели и логике контроллера, есть ли место в рельсах для хранения этихконстанты.

Чтобы я мог сделать это с моими моделями и контроллерами?

if myuser.type == MOM
elsif myuser.type == GRAND_MOTHER

РЕДАКТИРОВАТЬ: Решение, которое я выбрал в конце:

В модели:

  # constants
  TYPES = {
    :mom => 0,
    :dad => 1,
    :grandmother => 2,
    :grandfather => 3
  }

В логике:

if u.type == User::TYPES[:mom]

Несмотря на то, что он длиннее, я чувствовал, что он стал более понятным для других разработчиков, когда они читают мой код.Спасибо Таро ниже за это решение.

Ответы [ 4 ]

40 голосов
/ 06 ноября 2011

Что-то вроде:

class User < ActiveRecord::Base

  TYPES = %w{ mom dad grandmother grandfather son }

  TYPES.each_with_index do |meth, index|
    define_method("#{meth}?") { type == index }
  end

end


u = User.new
u.type = 4
u.mom? # => false
u.son? # => true
9 голосов
/ 01 сентября 2015

Начиная с Rails 4.1, есть поддержка ActiveRecord :: Enum .

Здесь есть полезное руководство здесь , но вкратце:

# models/user.rb
class User < ActiveRecord::Base
  enum family_role: [ :mum, :dad, :grandmother]
end

# logic elsewhere
u = User.first
u.family_role = 'mum'
u.mum? # => true
u.family_role # => 'mum'

Примечание. Для преобразования из вашей текущей схемы (где в вашей базе данных уже хранятся числа, соответствующие значениям), вы должны использовать синтаксис хэша:

enum family_role: { mum: 0, dad: 1, grandmother: 2 }

Я бы дополнительно предложил зарезервировать 0 длясостояние по умолчанию, но это только одно соглашение, а не критическое.

3 голосов
/ 19 марта 2015

Вам следует избегать использования "type" в качестве имени столбца модели, если вы не используете Single Table Inheritance.

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance

1 голос
/ 06 ноября 2011

Один из способов записать файл в папку инициализаторов или папку lib

say app_contants.rb и в этом файле вы можете написать

MOM=1

DAD=2
  1. Если вы пишете инициализатор Вы можете сделать

user.type == мама

2. Если вы создаете файл lib сделать его модулем

 module app_constants
    mom = 1
    dad = 2
  end 

и просто включите этот модуль, где вам нужно

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