HABTM Relationship -- How Can I Find A Record Based On An Attribute Of The Associated Model

You need to include the interests table.

@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4])

You had it right in your post, but you didn't pluralize interests.

Update

Because this answer is still getting attention, I thought it might be a good idea to update it using ActiveRecord::Relation syntax since the above way is going to be deprecated.

@events = Event.includes(:interests).where(interests: { id: 4 })

or

@events = Event.includes(:interests).where('interests.id' => 4)

And in case you want a custom condition

@events = Event.includes(:interests).where('interests.id >= 4')

The answer was helpful, thanks! I know this post is old, but I came up with a different solution that might be useful to someone. I noticed the query generate was quite long in my case. For me the table that was equatable to your "interests" table had a lot of columns and data in it. To avoid searching that table for the matching id, my solution looked similar to this:

@events = Event.all.where('events.id' => @interest.events.each(&:id)) 

This worked for me since I already had an instanced @interest object with the list of ids for the events. Of course you're not using some of the magic the rails has available. Also, I couldn't get your solution to work with "not". For example;

@events = Event.includes(:interests).where.not(interests: { id: 4 })

would not work. It would return 0 results. But this:

@events = Event.all.where.not('events.id' => @interest.events.each(&:id)) 

would work, which would return all the the events that don't have an association with @interest.