Problema con add_column en migraciones con bbdd PostgreSQL

Saludos a todos.

Soy un novato en Rails, y me ha surgido una duda que tiene que ver con
las migraciones y con PostgreSQL.

Estoy usando la versión svn de rails, para lo cual hago:

~ $ rails depot
~ $ cd depot
~/depot $ rake rails:freeze:edge

La aplicación usará una base de datos PostgreSQL, para lo cual configuro
adecuadamente mi aplicación editando el archivo config/database.yml.

Ahora creo un modelo para una tabla de artículos:

~/depot $ ruby script/generate model articulo

Me crea el archivo db/migrate/001_create_articulos.rb, que modifico
hasta tener el siguiente contenido:

class CreateArticulos < ActiveRecord::Migration
def self.up
create_table :articulos do |t|
t.column :denominacion, :string
t.column :precio, :decimal, :precision => 5, :scale => 2
end
end

def self.down
drop_table :articulos
end
end

Finalmente, hago:

~/depot $ rake db:migrate

lo cual me crea la tabla articulos correctamente:

depot_development=# \d articulos
Tabla «public.articulos»
Columna | Tipo |
Modificadores
--------------±-----------------------±-------------------------------------------------------
id | integer | not null default
nextval(‘articulos_id_seq’::regclass)
denominacion | character varying(255) |
precio | numeric(5,2) |
Índices:
«articulos_pkey» PRIMARY KEY, btree (id)

Ahora viene el problema:

Pretendo añadir una nueva columna, para lo cual creo una migración:

~/depot $ ruby script/generate migration add_coste

Modifico el archivo db/migrate/002_add_coste.rb, que modifico para que
tenga esta pinta:

class AddCoste < ActiveRecord::Migration
def self.up
add_column :articulos, :coste, :decimal, :precision => 6, :scale =>
2
end

def self.down
remove_column :articulos, :coste
end
end

Luego hago:

~/depot $ rake db:migrate

que me añade la nueva columna, PERO SIN PRECISIÓN NI ESCALA:

depot_development=# \d articulos
Tabla «public.articulos»
Columna | Tipo |
Modificadores
--------------±-----------------------±-------------------------------------------------------
id | integer | not null default
nextval(‘articulos_id_seq’::regclass)
denominacion | character varying(255) |
precio | numeric(5,2) |
coste | numeric |
Índices:
«articulos_pkey» PRIMARY KEY, btree (id)

Observad la diferencia entre las columnas precio y coste. La primera
tiene precisión (5) y escala (2), pero la segunda no. El caso es que en
la orden add_column especifico claramente que quiero precisión 6 y
escala 2.

Parece un fallo de add_column. ¿Qué os parece?

Una alternativa es utilizar SQL :

def self.up
execute “ALTER TABLE articulos ADD COLUMN coste DECIMAL(5,2) NOT
NULL DEFAULT 0”
end

Hice una prueba con MySQL y si funcionó.

Espero te sirva.

Jaime Mora R.

A mi me paso exactamente y lo resolvi con
add_column :articulos, :coste, “decimal(5,2)”
Silvio

2006/12/20, Ricardo Pérez [email protected]: