постоянные перечисления в рельсовых моделях и базе данных - PullRequest
1 голос
/ 19 апреля 2011

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

Допустим, у меня есть класс ActiveRecord с постоянным перечислением типов

class Foo < ActiveRecord::Base
   TYPES = {1 => :hello, 2 => :hi}
end

У меня естьпошел дальше и написал класс Enumeration, чтобы я мог сделать Foo :: TYPES.HELLO, чтобы получить 1, или Foo :: TYPES.HI, чтобы получить 2.

Я хочу эти типы в базе данных, чтобы я мог делать объединения,В настоящее время я создаю модель FooType, и у меня есть Foo assign_to: foo_type, поэтому у Foo будет поле foo_type_id.

class Foo < ActiveRecord::Base
   belongs_to :foo_type # 1 -> hello, 2 -> hi
end

Однако это неудобно, потому что:

  • Тестовые среды нарушаются, если я не заполняю тестовую базу данных каждый раз.Предполагается, что типы являются постоянными, поэтому они непосредственно используются в коде. Это, вероятно, самая большая боль
  • Если я сделаю статическое перечисление, потянув foo_type_ids из БД в модель, это также сломает в тестах
  • Если я добавлю новый типЯ должен отразить это в каждой базе данных
  • Каждая среда должна быть заполнена с типами

Ответы [ 2 ]

1 голос
/ 07 марта 2013

Я использовал камень enumerated_attribute из https://github.com/jeffp/enumerated_attribute

Это позволяет вам определять перечисление и его значения в модели. Он действительно разработан, чтобы облегчить работу с ними на стороне Rails / UI (не так много базы данных), но он избавит вас от необходимости поддерживать отдельную модель для вашего перечисления и обеспечит последовательность.

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

0 голосов
/ 19 апреля 2011

Наличие в вашем коде перечислителей просто делает ваш код читабельным, ничего кроме этого. Вместо целого числа (которое не имеет читабельности для разработчиков), вы используете тип String для представления этого значения

TYPES = {1 => :hello, 2 => :hi}

Я не думаю, что вы можете использовать отношения AR, например, "own_to" внутри нормального класса (не AR)

Я думаю, что вам нужно две таблицы

стол -

foos
        id
        type
        foo_type_id 

foo_types
        id
        foo_type

тогда у вас может быть AR

class Foo  < ActiveRecord::Base
   belongs_to :foo_type
end 

class FooType  < ActiveRecord::Base
  has_many : foos
end

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

НТН

ура

Sameera

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