8 votes

Différence entre la contrainte de clé étrangère et les références dans Rails

Y a-t-il une différence entre l'utilisation de t.references et en exécutant SQL pour créer une relation de clé étrangère entre products y category comme indiqué ci-dessous ? En d'autres termes, s'agit-il de deux façons différentes de faire la même chose ou est-ce que je manque quelque chose ?

class ExampleMigration < ActiveRecord::Migration
  def up
    create_table :products do |t|
      t.references :category
    end
    #add a foreign key
    execute <<-SQL
      ALTER TABLE products
        ADD CONSTRAINT fk_products_categories
        FOREIGN KEY (category_id)
        REFERENCES categories(id)
    SQL
    add_column :users, :home_page_url, :string
    rename_column :users, :email, :email_address
  end

  def down
    rename_column :users, :email_address, :email
    remove_column :users, :home_page_url
    execute <<-SQL
      ALTER TABLE products
        DROP FOREIGN KEY fk_products_categories
    SQL
    drop_table :products
  end
end

3voto

Pedro Nascimento Points 3781

Ce n'est pas la même chose. Par défaut, Rails n'applique pas les clés étrangères dans la base de données. Au lieu de cela, les références lors de la création à partir de la ligne de commande crée également un index régulier, comme ceci :

add_index :products, :category_id

Mise à jour :

Rails 5 fait exactement la même chose maintenant. Donc, pour répondre à la question initiale : De nos jours, les deux sont identiques.

0voto

PriteshJ Points 5097

J'ai trouvé quelque chose d'intéressant sur cette page.

http://railsforum.com/viewtopic.php?id=17318

D'après un commentaire :

Rails n'utilise pas de clés étrangères pour effectuer ses tâches de backend. Ceci parce que certaines bases de données comme sqlite n'autorisent pas les clés étrangères sur leurs tables. Donc Rails ne fournit pas d'aide pour construire une clé étrangère.

Il y a aussi un joyau étranger pour ajouter des clés étrangères à la table de la base de données. Qu'est-ce qui crée la contrainte FOREIGN KEY dans Ruby on Rails 3 ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X