Adam Albrecht
Adam Albrecht

Reputation: 6870

Help with a Join in Rails 3

I have the following models:

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

And what I want to do is, for a given event, find all the action items that have an action item type with a name of "foo" (for example). So I think the SQL would go something like this:

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"

Can anybody help me translate this into a nice active record query? (Rails 3 - Arel)

Thanks!

Upvotes: 3

Views: 11376

Answers (3)

ruurd
ruurd

Reputation: 131

Ehm, why not define

has_many :action_item_types, :through => :action_items

and refer to

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

?

Upvotes: 4

Naf Visser
Naf Visser

Reputation: 11

or (as long as "name" is a unique column name)

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

Upvotes: 1

Adam Albrecht
Adam Albrecht

Reputation: 6870

Well I think I solved it myself. Here's what I did

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

Upvotes: 8

Related Questions