ruby-on-rails - que - ruby on rails tutorial español
Problemas al configurar una clave principal personalizada en una migración de Rails 4 (3)
Uso postgresql 9.3, Ruby 2.0, Rails 4.0.0.
Después de leer numerosas preguntas sobre SO con respecto a la configuración de la clave principal en una tabla, generé y agregué la siguiente migración:
class CreateShareholders < ActiveRecord::Migration
def change
create_table :shareholders, { id: false, primary_key: :uid } do |t|
t.integer :uid, limit: 8
t.string :name
t.integer :shares
t.timestamps
end
end
end
También agregué self.primary_key = "uid"
a mi modelo.
La migración se ejecuta con éxito, pero cuando me conecto a la base de datos con pgAdmin III veo que la columna uid no está configurada como clave principal. ¿Qué me estoy perdiendo?
En mi entorno (activerecord 3.2.19 y postgres 9.3.1),
:id => true, :primary_key => "columname"
crea una clave primaria con éxito, pero en lugar de especificar ": limit => 8" el tipo de columna es int4!
create_table :m_check_pattern, :primary_key => "checkpatternid" do |t|
t.integer :checkpatternid, :limit => 8, :null => false
end
Perdón por la información incompleta.
He creado migraciones como esta:
class CreateShareholders < ActiveRecord::Migration
def change
create_table :shareholders, id: false do |t|
t.integer :uid, primary_key: true
t.string :name
t.integer :shares
t.timestamps
end
end
end
Eche un vistazo a esta respuesta . Intente execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);"
sin especificar el parámetro primary_key en el bloque create_table.
Te sugiero que escribas tu migración de esta manera (para que puedas retroceder normalmente):
class CreateShareholders < ActiveRecord::Migration
def up
create_table :shareholders, id: false do |t|
t.integer :uid, limit: 8
t.string :name
t.integer :shares
t.timestamps
end
execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);"
end
def down
drop_table :shareholders
end
end
UPD: Hay una forma natural (se encuentra aquí ), pero solo con el tipo int4:
class CreateShareholders < ActiveRecord::Migration
def change
create_table :shareholders, id: false do |t|
t.primary_key :uid
t.string :name
t.integer :shares
t.timestamps
end
end
end