Как описать столбец перечисления в миграции на Rails 3? - PullRequest
62 голосов
/ 26 ноября 2010

Как описать столбец перечисления в миграции на Rails 3?

Ответы [ 11 ]

67 голосов
/ 17 января 2014

Rails 4.1 на данный момент содержит enum !

Вы можете написать просто

class User < ActiveRecord::Base
  enum status: [ :admin, :user, :banned ]
end

Для миграции напишите

t.integer :status

Rails 3 и 4.0

Лучшее решение, на мой взгляд, это simple_enum gem.

8 голосов
/ 05 августа 2014

В Rails 3 Migration вы можете сделать следующее:

class CreateFoo < ActiveRecord::Migration
  def change
    create_table :foo do |t|
      t.column :foobar, "ENUM('foo', 'bar')"
    end
  end
end

Это создаст таблицу с одним столбцом "foobar" и значениями.

4 голосов
/ 19 июня 2013

Вы можете описать столбец перечисления с помощью:

t.column 'role', 'user_role'

Я создал тип enum с помощью:

execute "CREATE TYPE user_role AS ENUM ('consultant', 'admin');"

Проверка базы данных:

    Column     |          Type          | Modifiers | Storage  | Stats target | Description
---------------+------------------------+-----------+----------+--------------+-------------
 role          | user_role              |           | plain    |              |
3 голосов
/ 22 января 2012

Мне нравится enumerated_attribute gem: https://github.com/jeffp/enumerated_attribute

Простое перечисление для ваших моделей, объектов и видов.

Прекрасно работает с рельсами 3.1

3 голосов
/ 26 ноября 2010

Что-то вроде

class User < ActiveRecord::Base
   validates_inclusion_of :status, :in => [:active, :inactive]

   def status
     read_attribute(:status).to_sym
   end

   def status= (value)
     write_attribute(:status, value.to_s)
   end
 end
2 голосов
/ 19 декабря 2014

Это также будет работать ....

add_column :table_name, :column_name, "enum('abc','def','ghi')", :default => 'abc'

1 голос
/ 24 июня 2015

Что мне помогло, так это преобразование его из символов в целые числа

TYPE_MAP = { type_one: 1, type_two:2, another_type:3 }

def type
    TYPE_MAP.key(read_attribute(:type))
end

def type=(s)
    write_attribute(:type, TYPE_MAP[s])
end

Но для контроллера вы должны снова отобразить его так:

 def create
  @cupon_type = CuponType.new(params[:cupon_type])
  @cupon_type.type = params[:cupon_type][:type].to_sym

Обратите внимание на .to_sym , который переопределяет первое создание объекта (в моем случае это были купоны).

Теперь вы можете использовать его так:

c.type == :type_one
c.type = :type_two
1 голос
/ 26 ноября 2010

Я буду использовать гем enum_fu: https://github.com/ikspres/enum_fu

0 голосов
/ 24 ноября 2013

Используйте enum_column для добавления поддержки enum в активную запись

https://github.com/mdsol/enum_column

0 голосов
/ 17 апреля 2013

Посмотрите на active_enum .

Я думаю, что это соответствует вашим потребностям.

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