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?
Répondre
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.
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
Il est le modèle. J'ai besoin d'une migration. – Zeck
Cela a été collé à partir de http://stackoverflow.com/questions/693928/how-replacecreate-an-enum-field-on-rails-2-0-migrations – Jeriko
Ceci a été collé à partir de http://zargony.com/2008/04/28/five-tips-for-development-rails-applications – demas
t.enum :file_type ,:limit => [:jpg, :png, :gif] ,:default => :gif
Quel plugin utilisez-vous pour cela? enum n'est pas supporté par défaut –
script/plugin install svn: //rubyforge.org/var/svn/enum-column/plugins/enum-column – HeeL
Cela ne fonctionnera pas avec Rails 3 cependant ... –
Je vais utiliser la gemme enum_fu: https://github.com/ikspres/enum_fu
N'a pas été mis à jour depuis 2009. Ne semble pas être activement maintenu. – phatmann
J'aime enumerated_attribute bijou: https://github.com/jeffp/enumerated_attribute
ENUM facile pour vos modèles, objets et vues .
fonctionne bien avec les rails 3.1
Jetez un oeil à active_enum.
Je pense que cela correspond à vos besoins.
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 | |
Utilisez enum_column pour ajouter le support ENUM vers l'enregistrement actif
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.
Cela fonctionne aussi pour Rails 4. – bigtex777
Cela fonctionnera également ....
add_column :table_name, :column_name, "enum('abc','def','ghi')", :default => 'abc'
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
Vous pouvez ajouter '.with_indifferent_access' à' TYPE_MAP' pour autoriser l'accès par chaîne – Chris
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
@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
@migu Pouvez-vous vérifier ce lien - je suis super intéressé par cela, mais ce n'est pas génial pour moi. :) Merci. –