web-dev-qa-db-fra.com

Comment décrire une colonne d'énumération dans une migration Rails 3?

Comment décrire une colonne d'énumération dans une migration Rails 3?

63
Zeck

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.

68
asiniy

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.

8
amerdidit

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    |              |
5
Moriarty

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

3
user1085302

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
3
demas

Cela fonctionnera également ....

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

2
bigtex777

J'utiliserai la gemme enum_fu: https://github.com/ikspres/enum_f

1
Pasta

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
1
DanielZiv

Utilisez enum_column pour ajouter le support enum à l'enregistrement actif

https://github.com/mdsol/enum_column

0
Mohsen Alizadeh

Jetez un œil à active_enum .

Je pense que cela correspond à vos besoins.

0
pisaruk