I'm trying to make my ActiveRecord queries more efficient. I have Users and Items, a user has a feeling about an item, with a boolean response.
Here's my models:
User:
has_many :feelings
has_many :items, :through => :feelings
Feeling:
belongs_to :user
belongs_to :item
attr_accessible :response
Item:
attr_accessible :name
So, I can get a list of a user's feelings by:
User.find(1).feelings
and I can get a list of the items he has feelings about by:
User.find(1).items
This is all fine. What I want though, is a combination of the two above queries in one result set. Ideally, I'd like to be able to query a list of the user's items, and with those results get their response on each item.
If this was straight SQL, I could do:
SELECT * FROM items INNER JOIN feelings ON items.id=feelings.item_id WHERE feelings.user_id = 1
This then gives me everything I need in one table. This is also what ActiveRecord does when querying User.find(1).items
, except it throws away the data in the feelings table before it creates my hash of results.
How do I stop it throwing out the intermediatry data, and hence saving me an extra database query?
Any help appreciated!
You can use write it like this in Rails 3,
User.find(1).feelings.includes(:item)
and in Rails 2,
User.find(1).feelings.find(:all, :include => :item)
Usually this results two queries. One selects the feelings, and another select the items.