2010-04-03 13 views
14

Soy nuevo en Ruby on Rails (conozco a Ruby decentemente) y mirando las herramientas de migración, suena realmente increíble. Los esquemas de base de datos pueden finalmente (fácilmente) entrar en control de fuente.Claves foráneas con ActiveRecord de Rails :: ¿Migración?

Ahora mi problema con eso. Cuando se usa Postgres como la base de datos, no configura las claves externas. Me gustaría los beneficios de las claves externas en mi esquema, como la integridad referencial. Entonces, ¿cómo aplico claves externas con Migraciones?

Respuesta

12

La filosofía de Rails es que las verificaciones de integridad son la lógica de negocios que pertenece al modelo. Es por eso que está viendo lo que está viendo en el DB; whatever_id es solo un int y no un fk "real" a la vista. No es un error, es por diseño y es un poco raro al principio. En general, la única razón que impulsa a las personas a trabajar con fks en el nivel de base de datos es cuando se accede al DB por más de una aplicación o es un sistema heredado. Hay mucha discusión y algunos grandes enlaces aquí: Why do Rails migrations define foreign keys in the application but not in the database?

+0

Bueno, mi objetivo es un proyecto nuevo, y ninguna otra aplicación accederá a él ... ¿así que tal vez no lo necesite? Se siente raro aunque lol – Earlz

+1

Se siente raro. Eventualmente, ves el sentido de eso. Para abordar su problema de velocidad a continuación, debe destacar el uso del comando add_index en sus migraciones. Un fk agrega un índice a la base de datos automáticamente. En Rails, solo agrégalos tú mismo según sea necesario ... Si lo recuerdas :) – mikewilliamson

+0

FYI fk = clave externa, int = integridad – Ameen

7

mira esto: http://github.com/matthuhiggins/foreigner

Pero primero asegúrese de que realmente los necesite (por ejemplo, la integridad referencial es algo que en teoría no debe romper el tiempo que su código es correcto, y usted sabe acerca :dependent => :destroy y la diferencia entre user.delete y user.destroy).

+0

Bien, estoy pensando no sólo acerca de la integridad referencial, sino también de las ventajas de velocidad de claves externas cada vez que se une a 2 key'd tablas. – Earlz

+1

@Earlz, sé que esta es una gran lata de gusanos en la comunidad de rieles, pero si estás usando mysql, parece obvio. Este complemento funciona asombrosamente. 'FK in Rails == HAPPY' :) –

+2

BTW, el soporte de Rails en fks no afecta la velocidad de las uniones, aún puede definir un índice en cualquier campo. – sahglie

1

Hay una serie de plugins disponibles (búsqueda de Google) para los carriles que va a crear las claves externas para que cuando se utiliza un símbolo especial en sus migraciones (foreign_key_migrations es una del libro Advanced Rails Recipes). Solo tenga en cuenta que Rails no funciona bien con este concepto, especialmente cuando intenta eliminar objetos (como lo menciona glebm).

0

Acabo de encontrar esta publicación. Quizás alguien lo encuentre útil. Así es como se crean las limitaciones:

http://guides.rubyonrails.org/migrations.html#using-reversible

class ExampleMigration < ActiveRecord::Migration 
def change 
create_table :products do |t| 
    t.references :category 
end 

reversible do |dir| 
    dir.up do 
    #add a foreign key 
    execute <<-SQL 
     ALTER TABLE products 
     ADD CONSTRAINT fk_products_categories 
     FOREIGN KEY (category_id) 
     REFERENCES categories(id) 
    SQL 
    end 
    dir.down do 
    execute <<-SQL 
     ALTER TABLE products 
     DROP FOREIGN KEY fk_products_categories 
    SQL 
    end 
end 

add_column :users, :home_page_url, :string 
rename_column :users, :email, :email_address 
end 
Cuestiones relacionadas