2008-10-06 5 views
1

Je n'ai pas d'environnement Rails mis en place et c'est en fait assez difficile de trouver une réponse rapide, alors je vais demander aux experts. Lorsque Rails crée une table en fonction de votre "modèle" que vous avez configuré, Rails crée-t-il une table qui reflète exactement ce modèle ou ajoute-t-il d'autres champs à la table pour l'aider à travailler sa magie? Si oui, quels autres domaines ajoute-t-il et pourquoi? Peut-être que vous pourriez couper et coller la structure de la table, ou simplement me diriger vers une section doc ou tutoriel qui aborde cela.À quoi ressemble une table db créée par le framework Rails?

Répondre

5

Dans ActiveRecord, les modèles sont créés à partir de tables de base de données, et non l'inverse.

Vous pouvez également vous intéresser aux migrations, qui sont un moyen de décrire et de créer la base de données à partir du code Ruby. Cependant, la migration n'est pas liée au modèle; le modèle est toujours créé au moment de l'exécution en fonction de la forme de la base de données.

Il y a des screencasts liés à ActiveRecord et sur le site Migrations Rails: http://www.rubyonrails.org/screencasts

+0

C'est bizarre parce que la vidéo que j'ai vu d'un mec qui a fait la démonstration de l'awesomeness de Rails a apporté des changements au modèle et a propagé ces changements dans la base de données. Ou est-ce que je me souviens mal? – Ixion

+0

J'ai seulement utilisé ActiveRecord. Peut-être que ce que vous avez vu était un système d'accès aux données différent. –

+0

Ixion, vous pensez probablement à la fameuse vidéo Blog in 15 Minutes, qui utilisait Migrations pour apporter des modifications au schéma de base de données qui étaient immédiatement reflétées dans les formulaires à l'écran en raison de l'utilisation de l'échafaudage. –

1

Here de la documentation officielle pour ActiveRecord. Il est d'accord avec Brad. Vous avez peut-être vu une méthode d'accès différente ou une migration (qui modifie les tables et donc le modèle)

6

Si vous construisez une application complètement nouvelle, y compris une nouvelle base de données, alors vous pouvez construire toute la partie arrière avec migrations. Exécution

ruby script/generate model User name:string 

produit à la fois un fichier user.rb pour le modèle et une migration:

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.string :name 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

Vous pouvez voir que par défaut ajoute « horodatages » pour (créé et dernière mise à jour) le script générer et ils sont gérés automatiquement si autorisés à rester présents.

Non visible, mais important, est qu'une colonne supplémentaire, "id", est créée pour être la clé primaire unique. Ce n'est pas compliqué, cependant - vous pouvez spécifier votre propre clé primaire dans le modèle, ce qui est utile si vous travaillez avec un schéma hérité. En supposant que vous conserviez id comme clé, Rails utilisera toutes les fonctionnalités spécifiques au SGBDR disponibles pour les nouvelles valeurs de clé.

1

J'ai eu un peu d'expérience en transférant des bases de données existantes dans Rails et en accédant à des bases de données Rails à partir de scripts externes. Cela ressemble à ce que vous essayez de faire. Mon expérience est dans les bases de données Rails construites au-dessus de MySQL, donc votre kilométrage peut varier.

Le seul champ masqué est le plus évident - le champ "id" (un entier) que Rails utilise comme clé primaire par défaut. Sauf spécification contraire, chaque modèle dans Rails possède un champ "id" qui est une clé primaire unique, incrémentée et entière. Ce champ "id" apparaîtra automatiquement dans tout modèle généré dans Rails via une migration, sauf si vous dites à Rails de ne pas le faire (en spécifiant un champ différent pour être la clé primaire). Si vous travaillez avec des bases de données Rails en dehors de Rails, vous devez faire attention à cette valeur.

Le champ "id" est un élément clé de la magie Rails car il est utilisé pour définir les associations de Rails. Disons que vous reliez deux tables ensemble --- Groupe et Personne. Le modèle de groupe aura un champ "id", et le modèle de personne devrait avoir à la fois son propre champ "id" et un champ "group_id" pour la relation. La valeur de "group_id" renvoie à l'identifiant unique du groupe associé.Si vous avez construit vos modèles d'une manière qui suit les conventions de Rails, vous pouvez profiter des associations de Rails en disant que le modèle de groupe "has_many: people" et que le modèle Person "belongs_to: group".

Les migrations de lignes doivent également, par défaut, ajouter des champs "created_at" et "updated_at" (les "timestamps"), qui sont des champs datetime. Par défaut, ceux-ci profitent de la "magie" dans la base de données --- pas dans Rails lui-même --- pour mettre à jour automatiquement chaque fois qu'un enregistrement est créé ou modifié. Je ne pense pas que ces colonnes vont vous trébucher, car elles devraient être prises en charge au niveau de la base de données, pas par une magie Rails spéciale.

+0

Les champs created_at et updated_at sont gérés dans Rails, et non via une base de données "magic". Vous pouvez le voir directement dans le SQL généré. – ScottJ

Questions connexes