2017-08-15 7 views
0

Nouveau sur seqeul et sql en général. J'ai deux tables, groups et resources, qui sont associées many_to_many et ont donc une table de jointure groups_resources. J'ai aussi une table task qui a un foreign_key :group_id, :groups et est associée many_to_one avec des groupes.Interrogation entre deux tables partageant une association

J'essaie de comprendre quelle requête utiliser, ce qui me permettra d'obtenir les ressources capables d'effectuer une tâche, en fonction du groupe d'une tâche. Dois-je faire une requête compliquée via la table de jointure `groups_resources ', ou y a-t-il une requête/manière plus simple de configurer mes associations?

Merci!

Répondre

1

Je structurerais l'instruction SQL comme ci-dessous. Ce qui vous fournirait les ressources objets associés à un ID de tâche spécifique via la table de jointure.

SELECT r.* 
FROM resources r 
JOIN groups_resources gr ON gr.resources_id = r.id 
JOIN groups g ON gr.group_id = g.id 
JOIN task t ON t.id = g.id 
WHERE t.id = ? 
0

Je pense suivante suffit:

select res.* from resources res, task tk, groups_resources gr 
where res.resource_id = gr.resource_id and 
gr.group_id = tk.group_id and 
tk.group_id=<>; 
0

Les deux autres réponses sont utiles pour savoir comment structurer une requête SQL, mais pensé que je voudrais répondre à ma propre question particulièrement en ce qui concerne Sequel. Il s'avère qu'il est un plugin many_through_many qui fait ce genre de requêtes simple, si vous faites les deux tables many_to_many:

Task.plugin :many_through_many 
Task.many_through_many :resources, 
    :through =>[ 
    [:groups_tasks, :task_id, :group_id], 
    [:groups, :id, :id], 
    [:groups_resources, :group_id, :resource_id] 
    ] 

Maintenant, vous pouvez simplement appeler quelque chose comme task.resources sur une instance Task, même si vos tables ne font pas explicitement associer des tâches et des ressources.