2010-05-16 9 views
2

Je suis nouveau dans le monde de Ruby, et il y a quelque chose de flou dans la définition des associations entre les modèles. La question est: où l'association est-elle sauvée?Ruby on Rails et les associations de base de données

Par exemple, si je crée un modèle client en exécutant:

generate model Customer name:string age:integer 

puis-je créer un modèle de commande

generate model Order description:text quantity:integer 

puis-je configurer l'association de la manière suivante:

class Customer < ActiveRecord::Base 
    has_many :orders 
end 

class Order < ActiveRecord::Base 
    belongs_to :customer 
end 

Je pense qu'il manque ici quelque chose, par exemple la clé étrangère entre les deux entités. Comment gère-t-il les associations créées avec les mots-clés "has_many" et "belongs_to"?

Merci

Répondre

3

Chaque fois que vous générez votre commande, vous pouvez le faire:

generate model Order description:text quantity:integer customer:references 

Et il crée automatiquement la clé étrangère dans la migration pour vous. La convention des rails est que chaque ligne aura une clé primaire appelée "id", et la clé étrangère est la table à laquelle elle se réfère, suivie d'un trait de soulignement, puis id. Dans ce cas, la table orders aura un attribut appelé "customer_id"

Puisque vous avez déjà généré le vôtre, vous devez créer un nouveau script de migration qui ajoute une colonne entière appelée "customer_id" à votre table de commandes.

ne souhaitez pas de modifier une migration existante. Juste en créer un nouveau qui ajoute la colonne.

class add_customer_id_to_orders < ActiveRecord::Migration 
    def self.up 
    add_column :orders, :customer_id, :integer 
    end 

    def self.down 
    remove_column :orders, :customer_id 
    end 
end 

Note: Si vous avez déjà fait quelque chose pour créer des données dans votre base de données, cela va entraîner des clés étrangères null, que vous voulez corriger, ou tout simplement supprimer et créer de nouvelles données.

1

Vous devez ajouter une colonne (entier) à votre table de commandes, appelée 'customer_id'.