2010-01-19 6 views
0

Je viens d'un environnement Java où nous écrivons nos propres requêtes ou procédures stockées et traitons directement avec des bases de données de bas niveau. Je passe le livre AWDR 3ème édition et ne peux pas saisir le concept de jointures.Ressources qui expliquent le mieux les associations utilisées dans Rails

Est-ce que quelqu'un peut partager une ressource qu'il a utilisée lors de sa première utilisation de Rails? Disons que je veux une table Customer et une table Order. un client peut passer de nombreuses commandes. Donc, ma classe Customer contiendra :has_many order_id

Si je fais ce qui précède, fera-t-il des clés étrangères/primaires dans la base de données actuelle?

Maintenant, disons que je veux trouver tous les clients qui commande id = 5

Comment puis-je faire cela?

Est-il bon d'aller avec find_by_sql?

Répondre

1

Je pense que je peux vous donner un aperçu rapide.

Vous avez l'habitude de traiter directement avec SQL, et la bonne chose est que Rails promeut une bonne conception de base de données. Si vous avez une table de livres et une table de chapitres, un livre aura beaucoup de chapitres, correct? Donc, tout comme dans d'autres configurations de base de données, la table de chapitre devrait avoir une clé étrangère indiquant à quel livre il appartient.

En supposant que vous avez cette clé étrangère dans la table des chapitres, vous pouvez configurer votre modèle de livre comme ceci:

# app/models/book.rb 
class Book < ActiveRecord::Base 
    has_many :chapters 
end 

Vous dire Rails qu'un livre a littéralement de nombreux chapitres. Donc, si vous avez un objet livre, vous pouvez dire book.chapters et cela retournera un tableau des objets de chapitre qui appartiennent à ce livre. Rails saura regarder la table des chapitres pour la clé étrangère book_id, aucun SQL personnalisé requis.

A l'inverse, en supposant la même configuration de base de données, vous pouvez définir votre modèle de chapitre à associer à des livres, comme ceci:

# app/models/chapter.rb 
class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

Avis :book ici est singulier, juste un idiome qui aide à la lisibilité, depuis un chapitre ne peut appartenir qu'à un seul livre. Maintenant, si vous avez un objet chapitre et dites chapter.book, l'objet livre auquel appartient le chapitre sera retourné.

Tout comme dans d'autres applications de base de données, la clé étrangère est toujours dans la table "appartenu à".

J'espère que cela aide!

0

Comme le suggère le Ruby On Rails guides est un bon endroit pour commencer, avec le RailsCast site

Le point clé est que les clés étrangères, bien que sous-entendus par l'utilisation des abstractions ActiveRecord telles que :belongs_to, :has_many, :has_and_belongs_to_many etc. , sont pas créé pour vous. Dans les guides Rails notes sur Associations vous remarquerez des commentaires comme:

«Dans tous les cas, Rails ne pas créer des colonnes de clé étrangère pour vous, vous devez les définir explicitement dans le cadre de vos migrations. »

Cette note est souvent référencée dans les détails des associations individuelles sous l'option :foreign_key. Je suppose que ce n'est souvent pas évident et d'après mon expérience (en particulier venant d'un arrière-plan Java/C++) j'ai trouvé que je devais imprimer et lire l'ensemble des guides plusieurs fois pour vraiment apprécier l'élégance, la simplicité ainsi que la richesse des informations contenues en leur sein. Sur une note de côté - c'est génial de ne pas avoir à faire avec toute la plomberie à basse altitude selon l'expérience de Java.

Questions connexes