Old Emmanuel Oga's Weblog (new one is at www.emmanueloga.com)

Update a selectable_enums_as

Posted in enums, rails, ruby, Uncategorized by emmanueloga on julio 26, 2007

Actualice mi “selectable_enums_as” ( http://pastie.caboo.se/82509 ) para:

  1. Obtener un hash para look_up de la descripcion de la constante
  2. Deshabilitar opciones en la vista (o sea, que options_for_select no la vea)

Para que servia esto? Para esos casos en los que un model tiene un campo numerico que representa un tipo. Por ejemplo, en un model Book:

#== Schema Information
# Schema version: 13
#
# Table name: books
#
#
#  id             :integer(11)   not null, primary key
#  description : text
#  type        :integer(11)   default(0)

class Book < ActiveRecord::Base
end&#91;/sourcecode&#93;Si nuestra app solo manejara los tipos 1 == novela y  2 == cuento, en vez de crear otro model BookType y cambiar type por book_type_id, podemos hacer lo siguiente:

&#91;sourcecode language='ruby'&#93;
selectable_enum_as :BOOK_TYPES,
  &#91;'NOVELA', :NOVELA&#93;,
  &#91;'CUENTO', :CUENTO&#93;,
&#93;&#91;/sourcecode&#93;Esto crea varias cosas:
<ol>
	<li>Opciones para options_for_select (podemos hacer simplemente options_for_select(Book::BOOK_TYPES))</li>
	<li>Constantes: Book::CUENTO, Book::NOVELA, cuyos valores son los que se van a guardar en la base de datos.</li>
	<li>Un hash BOOK_TYPES_NAME para obtener la descripcion del  tipo. Por ejemplo: BOOK_TYPES_NAME[Book::Novela]= 'Novela'.</li>
</ol>
Por ultimo, si quieren deshabilitar una opcion, no se debe sacar del array a menos que actualicen todos los registros. Puede que haya registros que esten usando ese tipo. En vez de sacarlo del array, pueden hacer:


  selectable_enum_as :BOOK_TYPES, [
    ['NOVELA', :NOVELA],
    ['CUENTO', :CUENTO,
    ['CUENTO_CORTO', :CUENTO_CRT],
    ['CUENTO_LARGO', :CUENTO_LRG],
  ]

Algo mas… NO SE LES OCURRA USAR UNA COLUMNA DE NOMBRE “type” EN SU MODEL!!! Eso puede ser un lindo bug para trackear hasta que se aviven que ya existia un metodo type en sus objetos… (Object.type les suena??? aunque esta marcado com deprecado en ruby 1.8.6, calculo que queda un rato largo hasta que lo saquen. )

Tagged with: , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: