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

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

Ответ 1

Rails 4.1 содержит перечисление сейчас!

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

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

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

t.integer :status

Rails 3 и 4.0

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

Ответ 2

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

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

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

Ответ 3

Что-то вроде

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

Ответ 4

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

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

Хорошо работает с рельсами 3.1

Ответ 5

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

t.column 'role', 'user_role'

Я создал тип перечисления с помощью:

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

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

    Column     |          Type          | Modifiers | Storage  | Stats target | Description
---------------+------------------------+-----------+----------+--------------+-------------
 role          | user_role              |           | plain    |              |

Ответ 7

Это также сработает.

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

Ответ 8

Что сработало для меня, это сопоставление от символов до целых чисел

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

Ответ 9

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

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

Ответ 11

t.enum :file_type ,:limit => [:jpg, :png, :gif] ,:default => :gif