2010-03-21 4 views
1

J'ai les données suivantes:Comment créer et utiliser une table de jonction dans Rails?

  1. Un poste appelé Hello a catégories greet
  2. Un autre poste appelé Hola a catégories greet, international

Mon schéma est:

create_table "posts", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

create_table "categories", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

create_table "posts_categories", :force => true do |t| 
    t.integer "post_id" 
    t.integer "category_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Après la lecture le guide Rails, la relation la plus appropriée f ou ce qui précède semble être:

class Post < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :posts 
end 

Ma table de jonction semble également avoir une clé primaire. Je pense que je dois m'en débarrasser.

  1. Quelle est la commande de migration initiale pour générer une table de jonction dans Rails?
  2. Quel est le meilleur plan d'action, devrais-je supprimer posts_categories et le recréer ou simplement supprimer la colonne de la clé primaire?
  3. La table de jonction a-t-elle un modèle correspondant? J'ai utilisé scaffold pour générer le code de la table de jonction, devrais-je me débarrasser du code supplémentaire?

En supposant que tout ce qui précède a été corrigé et fonctionne correctement, comment puis-je interroger tous les messages et les afficher avec leurs catégories nommées dans la vue. Par exemple:

Post #1 - hello, categories: greet 
Post #2 - hola, categories: greet, international 

Répondre

3

vous pouvez vérifier this web page de l'API rails doc.

  1. La méthode la plus simple pour générer une table de jonction est "script/generate model categories_posts category_id:integer post_id:integer". Notez que les noms de classe doivent être dans l'ordre alphabétique. Je suis assez indifférent à l'ensemble de la clé primaire, mais si cela devient un problème, vous pouvez générer une migration pour déposer comme 'script/generate DropPostsCategoriesIdFromPostsCategories posts_categories_id: integer' (assurez-vous que ce fichier de migration fait ce que vous voulez, je n'ai pas t testé et ce qu'il fait peut varier selon votre version des rails), puis faites rake db:migrate. changer la DB.

  2. pour le nom de la classe que vous utilisez, vous pouvez utiliser:

class Post < ActiveRecord::Base 
    has_many :categories, :through => :posts_categories 
end

has_many à travers vous permet de spécifier les noms de la table de jointure/jonction. ou vous pourriez laisser tomber la table et la régénérer avec le bon nom.

  1. (devrait être # 3) Oui, il suffit de générer un modèle pour une classe de jointure, ne faites pas l'échafaudage entier.(Voir ci-dessus)

pour trouver tous les messages, faire quelque chose comme @posts = Post.find(:all)

pour imprimer les catégories, faire quelque chose comme

@posts.each do | post | 
    print post.name, "\n" 
    @posts.categories.each do | cat | 
     print "\t", cat.name, "\n" 
    end 
end 

dans le code de rails réelle, vous voulez faire que dans la vue, c'est plus une chose de type console de sortie.

Questions connexes