Как описать столбец перечисления при миграции 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 | |
Ответ 6
Я буду использовать gem enum_fu: https://github.com/ikspres/enum_fu
Ответ 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.
Я думаю, что это соответствует вашим потребностям.
Ответ 10
Используйте enum_column для добавления поддержки enum к активной записи
Ответ 11
t.enum :file_type ,:limit => [:jpg, :png, :gif] ,:default => :gif