2010-11-25 17 views
3

je les modèles suivants:Aide Jointure Rails 3

class Event < ActiveRecord::Base 
    has_many :action_items 
end 

class ActionItem < ActiveRecord::Base 
    belongs_to :event 
    belongs_to :action_item_type 
end 

class ActionItemType < ActiveRecord::Base 
    has_many :action_items 
end 

Et ce que je veux faire est, pour un événement donné, trouver tous les éléments d'action qui ont un type d'élément d'action avec un nom de "foo" (par exemple). Je pense donc que le SQL irait quelque chose comme ceci:

SELECT * FROM action_items a 
INNER JOIN action_item_types t 
ON a.action_item_type_id = t.id 
WHERE a.event_id = 1 
AND t.name = "foo" 

Quelqu'un peut-il me aider à traduire cela dans une belle requête d'enregistrement actif? (Rails 3 - Arel)

Merci!

Répondre

8

Eh bien, je pense que je l'ai résolu moi-même. Voici ce que je l'ai fait

e = Event.find(1) 
e.action_items.joins(:action_item_type).where("action_item_types.name = ?", "foo") 
+9

Si vous voulez le rendre encore plus beau, vous pouvez faire 'e.action_items.joins (: action_item_type). Où (: action_item_types => {: name =>" foo "})' – Marc

+0

J'ai aussi remarqué que si vous passez une chaîne, pas un symbole, à vos jointures, elle ne forme pas la requête correctement. par exemple. faire Event.joins (: action_item_type) NOT Event.joins ("action_item_type") – Gayle

+0

Est-ce que cela fonctionne dans Rails4? 'subscriptions.joins (: plan) .where (: plans => {: is_free_trial => true})' renvoyer _Unknown column 'plans.is_free_trial' dans 'where' clause__ – cyrilchampier

1

ou (tant que "nom" est un nom de colonne unique,)

e.action_items.joins(:action_item_type).where(:name => "foo") 
4

Ehm, pourquoi ne pas définir

has_many :action_item_types, :through => :action_items 

et reportez-vous à

e.action_item_types.where(:name => "foo") 

?