Problema con migraciones y primary key

Buenas amigos listeros,

Esta es mi primera vez que escribo en esta lista, el hecho es que estoy
aprendiendo a usar rails y cada vez me gusta mas y se me ha presentado
un
problema
trantando de hacer una migracion, el problema es el siguiente tengo una
tabla establecimientos la cual tiene un campo llamado archvo que es
numerico
y es clave primaria de dicha tabla, pero leyendo por alli dice que lo
mas
recomendable es es tener como clave primaria id y auto_increment y a mi
no
me sirve de esa manera, necesito que sea -> :archivo, :integer.
Agradezco su
ayuda de antemano le anexo el código de la migración

class CreateEstablecimientos < ActiveRecord::Migration
def self.up
create_table :establecimientos do |t|
#creamos la tabla establecimientos
t.column :tipo_id, :integer,
:null => false #tipo de
establecimiento
t.column :nombre, :string,
:limit => 255, :null => false #nombre del
establecimiento
t.column :direccion, :text,
:limit => 255, :null => false #direccion
t.column :mapa_id, :integer,
:null => false #URL de la
imagen

    t.column :telefono,                                 :string,
:limit     => 20                                         #numero de

telefono
t.column :RIF,
:string,
:limit => 20, :null => false #debe tener RIF
a
juro
t.column :NIT,
:string, :limit => 20, :null => false #debe
tener
NIT a juro
t.column :registro_mercantil, :string,
:limit => 2, :null => false #Si/No
t.column :registro_sanitario, :string,
:limit => 2, :null => false #Si/No
t.column :conformidad_sanitaria, :string,
:limit
=> 2, :null => false #Si/No
t.column :permiso_sanitario, :string,
:limit => 2, :null => false #Si/No
t.column :conformidad_uso, :string,
:limit => 2, :null => false #Si/No
t.column :contrato_de_arendamiento, :string, :limit
=> 2, :null => false #Si/No
t.column :titulo_de_propiedad, :string,
:limit => 2, :null => false #Si/No
add
end
end

def self.down
drop_table :establecimientos
end
end

Nota: probe usando create_table :establecimientos, :primary_key =>
:archivo
do |t|
pero no me sirve ya que es auto_increment
Muchas GRACIAS dddde antemano.


Ruben C.
Debian GNU/Linux User

“Those who are enamored of practice without theory are like a pilot who
goes
into a ship without rudder or compass and never has any certainty where
he
is going. Practice should always be based on a sound knowledge of
theory.”

opps, el codigo va sin el add al final del metodo self.
hasta luego

Nota: probe usando create_table :establecimientos, :primary_key =>
:archivo
do |t|
pero no me sirve ya que es auto_increment

Si tan solo necesitas un campo llamado archivo que sea integer… y
usarlo como si fuese clave primaria. Usa esto:

create_table :establecimientos, :id => false do |t|

t.column :archivo, :integer

… #demás campos que ya tenías

end

Y luego en el modelo tienes que indicar que usas :archivo como clave
primaria

class Establecimientos < ActiveRecord::Base

set_primary_key :archivo

end

gracias Moises por tu respuesta, soluciono mi problema, pero existira
alguna
manera de declarar que eeeel campo archivo sea primario dentro de la
migracion?

En principio, no aparece ninguna forma directa usando create_table, sin
embargo tienes 2 opciones:

  • Generar el create “a mano”, usando execute y la sql

  • Dejarlo como dijimos y añadirle un índice único usando:

    add_index(:establecimientos, :archivo, :unique => true)

En mi opinión la segunda opción es más “rails way”, aunque, si ves
alguna diferencia real entre una primary_key no autoincremental y un
índice con restricción de unicidad entonces escoge la primera.

Espero que te sirva

En principio, no aparece ninguna forma directa usando create_table, sin
embargo tienes 2 opciones:
Generar el create “a mano”, usando execute y la sql
Dejarlo como dijimos y añadirle un índice único usando:
add_index(:establecimientos, :archivo, :unique => true)

gracias Moises, me gusto la segunda forma pero consegui una forma que me
parece un poco mejor, lo que hice es lo siguiente y me funciono
perfectamente:
class CreateEstablecimientos < ActiveRecord::Migration
def self.up
create_table :establecimientos, :id => false do |t|
.
.
.
end
execute “ALTER TABLE establecimientos ADD PRIMARY
KEY(`archivo`)”
end

def self.down
drop_table :establecimientos
end
end

GRACIAS por la ayuda!!!


Ruben C.
Debian GNU/Linux User

“Those who are enamored of practice without theory are like a pilot who
goes
into a ship without rudder or compass and never has any certainty where
he
is going. Practice should always be based on a sound knowledge of
theory.”

gracias Moises por tu respuesta, soluciono mi problema, pero existira
alguna
manera de declarar que eeeel campo archivo sea primario dentro de la
migracion?
Gracias!


Ruben C.
Debian GNU/Linux User

“Those who are enamored of practice without theory are like a pilot who
goes
into a ship without rudder or compass and never has any certainty where
he
is going. Practice should always be based on a sound knowledge of
theory.”

On 7/4/07, Ruben C. [email protected] wrote:

def self.up
drop_table :establecimientos
“Those who are enamored of practice without theory are like a pilot who goes
into a ship without rudder or compass and never has any certainty where he
is going. Practice should always be based on a sound knowledge of theory.”


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

El tipo de una columna no tiene porque ser un símbolo, de forma que
puedes utilizar una cadena y Rails lo
utilizará:
t.column ‘archivo’, ‘integer primary key’

Esa línea definiría una columna llamada archivo que fuera de tipo
integer y además clave principal.

Suerte.