Comment décrire une colonne d'énumération dans une migration Rails 3?
Rails 4.1 contient enum pour l'instant!
Vous pouvez écrire juste
class User < ActiveRecord::Base
enum status: [ :admin, :user, :banned ]
end
Pour la migration, écrivez
t.integer :status
Rails 3 et 4.0
La meilleure solution à mon avis est simple_enum gem.
Dans une migration Rails 3, vous pouvez effectuer les opérations suivantes:
class CreateFoo < ActiveRecord::Migration
def change
create_table :foo do |t|
t.column :foobar, "ENUM('foo', 'bar')"
end
end
end
Cela va créer le tableau avec la colonne unique "foobar" et les valeurs.
Vous pouvez décrire une colonne d'énumération avec:
t.column 'role', 'user_role'
J'ai créé le type enum avec:
execute "CREATE TYPE user_role AS ENUM ('consultant', 'admin');"
Inspection de la base de données:
Column | Type | Modifiers | Storage | Stats target | Description
---------------+------------------------+-----------+----------+--------------+-------------
role | user_role | | plain | |
J'aime enumerated_attribute gem: https://github.com/jeffp/enumerated_attribute
Énumération facile pour vos modèles, objets et vues.
Fonctionne bien avec Rails 3.1
Quelque chose comme
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
Cela fonctionnera également ....
add_column :table_name, :column_name, "enum('abc','def','ghi')", :default => 'abc'
J'utiliserai la gemme enum_fu: https://github.com/ikspres/enum_f
Ce qui a fonctionné pour moi, c'était de le mapper des symboles aux entiers
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
Mais pour le contrôleur, vous devez le mapper à nouveau comme ceci:
def create
@cupon_type = CuponType.new(params[:cupon_type])
@cupon_type.type = params[:cupon_type][:type].to_sym
Notez le . To_sym qui remplace la première création sur l'objet (dans mon cas c'était des coupons).
Vous pouvez maintenant l'utiliser comme ceci:
c.type == :type_one
c.type = :type_two
Utilisez enum_column pour ajouter le support enum à l'enregistrement actif
Jetez un œil à active_enum .
Je pense que cela correspond à vos besoins.