2010-11-26 20 views

Répondre

62

Rails 4.1 contains enum pour l'instant!

Vous pouvez écrire tout

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

Pour la migration écrire

t.integer :status 

Rails 3 & 4,0

La meilleure solution à mon avis est simple_enum petit bijou.

+2

Malheureusement, les valeurs sont stockées comme des nombres entiers non comme ENUM avec plusieurs inconvénients: http://hn.meteor.com/posts/6925010-32d11 – migu

+2

@migu ceci est de facto standard de rails enum. La gemme 'simple_enum' fonctionne de la même façon. Voir la mise à jour – asiniy

+2

@migu Pouvez-vous vérifier ce lien - je suis super intéressé par cela, mais ce n'est pas génial pour moi. :) Merci. –

3

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

Il est le modèle. J'ai besoin d'une migration. – Zeck

+2

Cela a été collé à partir de http://stackoverflow.com/questions/693928/how-replacecreate-an-enum-field-on-rails-2-0-migrations – Jeriko

+3

Ceci a été collé à partir de http://zargony.com/2008/04/28/five-tips-for-development-rails-applications – demas

-3
t.enum :file_type ,:limit => [:jpg, :png, :gif] ,:default => :gif 
+1

Quel plugin utilisez-vous pour cela? enum n'est pas supporté par défaut –

+2

script/plugin install svn: //rubyforge.org/var/svn/enum-column/plugins/enum-column – HeeL

+0

Cela ne fonctionnera pas avec Rails 3 cependant ... –

2

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');" 

Inspecter la base de données:

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

Dans un Rails 3 migration, 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 la table avec la seule colonne « foobar » et les valeurs.

+1

Cela fonctionne aussi pour Rails 4. – bigtex777

1

Cela fonctionnera également ....

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

1

Ce qui a fonctionné pour moi a été la cartographie à partir des symboles 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 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).

Maintenant, vous pouvez l'utiliser comme ceci:

c.type == :type_one 
c.type = :type_two 
+0

Vous pouvez ajouter '.with_indifferent_access' à' TYPE_MAP' pour autoriser l'accès par chaîne – Chris