2011-08-27 3 views
0

Je les modèles suivants:Rails: Active Record Question

require 'books_projects.rb' 

class Project < ActiveRecord::Base 
    has_many :book_to_projects 
    has_many :books, :through => :book_to_projects 
end 

require 'books_projects.rb' 

class Book < ActiveRecord::Base 
    has_many :book_to_projects 
    has_many :projects, :through => :book_to_projects 
end 

books_projects.rb:

class BookToProject < ActiveRecord::Base 
    set_table_name "books_projects" 
    belongs_to :book 
    belongs_to :project 
end 

Dans mon contrôleur de projets, je suis en train de le faire:

@projects = Project.find(:all, :include => [:books]) 

Mon espoir est d'obtenir une structure de données imbriquée qui ressemble à quelque chose comme:

projects: [ 
    { 
    .., 
    books: [ 
     { 
      .. 
     }, 
     { 
      .. 
     } 
    ] 
    } 
] 

Cela ne fonctionne pas. Comment puis-je atteindre cet objectif?

De même, la relation de modèle ci-dessus appelle-t-elle l'utilisation de has_and_belongs_to_many dans le projet et dans le livre au lieu de spécifier la table de jointure?

Merci d'avance!

Édition 1: Je n'ai pas de vue. Cela agit comme un service REST seulement. Je fais ce qui suit:

def index 
    @projects = Project.find(:all, :include => [:books]) 

    respond_to do |format| 
    format.xml { render :xml => @projects } 
    format.json { render :json => @projects} 
    end 
end 

Cela ne produit pas la sortie que je suis à la recherche (mentionné ci-dessus).

+0

Eh bien, ça devrait marcher! essayez <% = debug @project%> dans votre vue, vous devriez voir une représentation yaml de votre objet avec les livres inclus – charlysisto

+2

Si 'book_projects' n'a pas d'autres attributs, alors oui, utilisez' has_and_belongs_to_many'. En outre, je suis d'accord avec charlysisto: cela devrait-il fonctionner? Qu'est-ce qui ne fonctionne pas exactement? – Mischa

+0

Puis-je vous demander pourquoi vous «allez à l'encontre du grain»? Pourquoi avez-vous un fichier 'book_projects.rb' qui définit' BookToProject', mais le nom de la table est 'book_projects'? Pourquoi exigez-vous ce fichier de vos deux autres modèles? Vous devriez seulement l'exiger une fois quelque part dans votre projet, mais pourquoi exigez-vous du tout? – theIV

Répondre

1

tourne donc que les travaux suivants:

def index 
    @projects = Project.find(:all) 

    respond_to do |format| 
    format.json { render :json => @projects.to_json(:include => [:books]) } 
    end 
end 

Quelqu'un peut-il me dire pourquoi cela fonctionne et celui d'avant n'a pas?

+0

Si cela fonctionne, vous devriez le marquer comme la bonne réponse. Cela étant dit, il semble que 'to_json' n'inclura pas les associations par défaut, d'où la raison pour laquelle cela ne fonctionnait pas auparavant et que vous deviez les inclure explicitement. – theIV

+0

Aah! Merci! Oui, je vais le marquer dans environ 3 heures à partir de maintenant. Il ne me laisse pas le faire maintenant .. –

1

Vous code exactement ce que vous attendez de faire. Le problème est de vérifier cela.

Essayez ceci:

project = Project.find(:first) 
project.books.loaded? 

retourneraient faux

project = Project.find(:first, :include => [:books]) 
project.books.loaded? 

retournerait vrai :)

Les associations désireuses chargées ne présentent pas normalement lorsque vous inspectez l'objet.

Questions connexes