2010-11-12 6 views
0

Je travaille avec une structure de modèle qui n'est pas exactement idéale (ie je ne l'ai pas créée) et j'ai du mal à écrire une requête AR pour obtenir les données que je veux. ..Relations complexes entre les rails et la requête

J'ai les modèles suivants:

class Project < ActiveRecord::Base 
    has_many :project_states 
    has_many :states, :through => :project_states 
end 

class State < ActiveRecord::Base 
    has_many :forms 
    has_many :project_states 
    has_many :projects, :through => :project_states 
end 

class ProjectState < ActiveRecord::Base 
    belongs_to :state 
    belongs_to :project 
end 

class Form < ActiveRecord::Base 
    belongs_to :state 
end 

assez simple. Ish. Ce que j'essaye de faire est d'obtenir une liste de tous les formulaires pour tous les projets. Essentiellement disons que j'ai deux formes dans la base de données, et 2 projets dont chacun a deux formes. Je voudrais obtenir les résultats:

----------------------------------------------- 
project.name | state.name | form.name 

Project 1  Ohio   Form 1 
Project 1  California  Form 2 
Project 2  Ohio   Form 1 
Project 2  California  Form 2 

je peux le faire assez facilement avec la requête SQL suivante:

SELECT 
    states.name, forms.name, projects.name 
FROM 
    forms 
LEFT JOIN 
    states ON forms.state_id = states.id 
INNER JOIN 
    project_states ON project_states.state_id = forms.state_id 
LEFT JOIN 
    projects ON projects.id = project_states.project_id; 

Mais je ne suis pas sûr de savoir comment faire cela par AR. Je pourrais le faire comme une requête SQL directe, mais il existe des méthodes sur les modèles dont j'ai besoin pour l'affichage. Je pourrais le faire simplement en récupérant des projets, en les bouclant et en bouclant les formulaires pour chacun d'entre eux, mais l'affichage doit être une table triable et cela rendrait impossible le tri sur n'importe quel attribut de formulaire.

Existe-t-il un moyen facile de mettre en œuvre ce qui me manque? Par exemple si je fais quelque chose comme:

Form.joins(:states=> [:projects]) 

Cela renvoie un résultat pour chaque formulaire, pas un résultat pour chaque formulaire pour chaque projet. Si j'avais une relation directe entre les projets et les formulaires, ce serait assez facile car je ne pouvais que récupérer la table de jointure. Mais je n'ai pas ça ...

+0

peut-être que cela pourrait être utile http://niczsoft.com/2010/05/deep-associations-in-rails-activerecord/ – mpapis

Répondre

0

Suite, je ne pouvais pas vraiment trouver un moyen de le faire dans les rails sans avoir recours à find_by_sql, donc j'ai fini par créer une vue et un nouveau modèle pour la vue de obtenir les données que je voulais.

Questions connexes