Get parents via a condition on a child? (ActiveRecord)

I come from a PHP background where I worked without an ORM. I'm having some trouble converting what I know will work in raw SQL into ActiveRecord models.

I have the following two models (not my actual models, just as a generic example):

class Topic < ActiveRecord::Base   has_many :posts   ... end

class Post < ActiveRecord::Base   belongs_to :topic   attr_accessible :body   ... end

I want to work with the collection of Topics that have Posts with a certain value of :body. That is, "All topics that contain posts whose body is equal to 'example'"

If I was working with straight SQL I would do this

SELECT topics.* FROM   topics JOIN posts ON topics.id = posts.topic_id   WHERE   posts.body = "example"

In ActiveRecord I can get the list of Posts without a problem.

Post.find(:all, :conditions => {:body => "example"})

I think this is equivalent to the above

Post.find_all_by_body("example")

What I can't figure out is how to get the collection of Topics.

This doesn't work because Topics don't have :body's

Topic.find(:all, :include => :posts, :conditions => {:body => "example"})

I've looked at the generated SQL and because the :posts table is aliased I don't think I can come up with SQL fragment that would consistently work.

I can see how I may be able to first get the collection of Posts and then in another call to #find get the Topics I need, but that seems too roundabout.

What's the best way to do this with ActiveRecord?

Thanks!

In my limited understanding, I think if you managed to pull out the collection of Post, you have access to all Topic that are linked to that collection of Post.

I don't know if this will work, I think the following example will print out the Topic name of each of the post that has body = example.

  allpost = Post.find(:all, :conditions => {:body => "example"})

  allpost.each do | onepost |       puts onepost.topic.name   end

So you want to find all the topics where a post in that topic has the body of “example”?

Topic.find(:all, :include => :posts, :conditions => [“posts.body = ?”,params[:query]])