Rails : création de bases de données et multiples clés étrangères

In: Rails

30 juin 2008

Ruby on Rails propose des méthodes « create_table»  et une fonctionnalité « db:migrate» , qui permetten de créer la base de données de votre application.
Des exemples sur « Migration»  sont disponibles avec l’API du framework.

Par défaut, l’outil crée un champ « id» , qui est la clé primaire de votre table.
Vous pouvez modifier cela avec les options « id»  et « primary_key»  lors de l’appel à la fonction create_table.
Ainsi, pour créer une table « test»  sans clé primaire, il vous faut faire :

create_table :test, :id => false do |t|
end

Vous pouvez également créer une table avec une clé primaire qui se nommerait « myId» 

create_table :test, :primary_key => "myId" do |t|
end

Mais vous pouvez également désirer créer une table avec deux champs comprenant la clé primaire. Vous pouvez essayer de mettre deux champs dans primary_key malheureusement, cela ne fonctionne pas (vraissemblablement car certains SGBDR ne gèrent pas la création de clé primaires constituées de deux champs).

Il va donc falloir tricher. Sachez déjà que notre base ne sera pas en 3e forme normale.

Créeons donc d’abord une table « user_access»  avec deux champs : user_id et access_id

create_table :user_access, :id => false do |t|
t.column :user_id, :integer
t.column :access_id, :integer
end

Maintenant il nous faut déclarer nos deux champs comme étant des index.

add_index :user_access, [:user_id, :access_id], :unique

Nous créeons donc un index unique contenant nos deux champs. Nous n’avons pas de clé primaire à proprement parler. Mais le SGBDR traitera la chose de la même manière.

Le code en entier :

class AddUserAccess < ActiveRecord::Migration
def self.up

create_table :user_access, :id => false do |t|
t.column :user_id, :integer
t.column :access_id, :integer
end
add_index :user_access, [:user_id, :access_id], :unique
end
end

Comment Form

Photostream

    FlorentPhilou vs 5DMadagascarHélèneLucienPhilou vs langueMug DesignRails TeaPHP vs. Django
  • thoas: Pour avoir pratiqué un peu des deux (mercurial et git), je les trouve très similaire dans leur app [...]
  • Damien: Non, je n'ai jamais testé et encore moins pratiqué mercurial. Je suis plus proche de la communautà [...]
  • Florent V.: Pour l’instant je n’ai utilisé git que pour récupérer les sources de deux ou trois projets, d [...]
  • Sebastian: In your Auth Class is a Bug: return parent::__construct($file, $realm, @$_SERVER['PHP_AUTH_USER'] [...]
  • Damien: Si je suis méchant on me le reproche et pareil quand j'essaye de remonter les notes. On peut pas p [...]

Rss Feeds

En Français :


In English :