2009-10-18 10 views

Respuesta

12

¿Intentas esto?

create_table(:table_name, :id => false) do |t| 
    t.integer :id, :options => 'PRIMARY KEY' 
end 
+3

Esto no funcionó para mí con el adaptador mysql2 y Rails 3.2.13 –

6

que no funcionó para mí, pero el siguiente hecho: ¿

create_table(:table_name, :id => false) do |t| 
    t.column :id, 'int(11) PRIMARY KEY' 
end 

El único problema es que se pierde en el schema.rb.

8

Bien, la pregunta es antigua y el OP no especificó las versiones. Ninguna de las respuestas dadas aquí trabajó para mí con estas versiones:

mysql2 0.3.11 
rails 3.2.13 
mysql 5.5 

Terminé yendo para esto:

class SomeMigration < ActiveRecord::Migration 
    # emulate a primary_key column without auto-increment 
    # the solution here is to use a non-null integer id column with a unique index 
    # this is semantically different from PRIMARY KEY in mysql but not 
    # _too_ functionally different, the only difference is that mysql enforces 
    # no-more-than-one-primary-key but allows >1 unique index 
    def up 
    create_table :foobars, :id => false do |t| 
     t.integer :id, :null => false 
     t.string :name 
    end 
    add_index :foobars, :id, :unique => true 
    end 
end 

espero que salva a alguien por ahí de gastar tiempo buscando esto abajo, o peor ... usando la respuesta sin verificar lo que hace al DB ... porque el resultado de usar las respuestas de sojourner o jim (con mis versiones de las dependencias) es que la migración funciona bien, pero se permiten identificadores NULL y los ID duplicados están permitidos. No intenté la respuesta de Shep porque no me gusta la idea de que db/schema.rb sea inconsistente (+1 a Shep por ser explícito acerca de ese inconveniente, a veces sería una cosa mala)

Estoy no está seguro de la importancia de esto, pero con esta solución, MySQL describe lo muestra como una clave principal, al igual que una mesa de AR con defecto: id ... como en:

mesa con AR por defecto: Identificación del

+---------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+---------------------+--------------+------+-----+---------+----------------+ 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 

tabla con mi solución:

+--------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+--------------+--------------+------+-----+---------+-------+ 
| id   | int(11)  | NO | PRI | NULL |  | 

que es un poco interesante porque el SQL generado por la migración con mi solución no incluye "PRIMARY KEY" (por supuesto) ... pero con AR predeterminado: id lo hace ... así que parece mysql, al menos para describe trata de una clave única indexada no nulo como clave principal

HTH alguien

+0

Si usa su aproximación de ': id => false', elimine el' add_index: id' y en su lugar use 'execute 'ALTER TABLE foobars ADD ADD PRIMARY KEY (id);' 'después de' create_table', you' Obtendré una verdadera columna e índice de clave principal. Esto debe ser DDL compatible con ANSI SQL-92. – ches

+1

Aunque no lo convertirá en 'schema.rb', ugh. – ches

+0

@ches eso es exactamente por lo que abandoné esa idea :) –

4

Se puede crear una tabla como la siguiente:

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :routers, { id: false } do |t| 
     t.integer :id 
    end 

    execute "ALTER TABLE routers ADD PRIMARY KEY (id);" 
    end 
end 

y que realmente funciona en Rails 4.0.2 y Postgresql 9.3.2.

+0

Esto parecía hacer lo que quería para los rieles 4.2 y mysql ... cambié ligeramente a 't.integer: id, null: false' – Intentss

Cuestiones relacionadas