Question

I'm trying to join two tables and return all columns, not just the ones associated with the model.

I have something like that looks like this:

Comment.joins(:user).select("*")

The SQL looks fine, but still, it only returns the comments and none of the user info associated with it.

How can I retrieve * and not just comments.*?

Was it helpful?

Solution

What about

comments = Comment.includes(:user).all

Now comments is going to be an array so you'll have to loop through it to see all the users.

#won't work
comments.user 

#should work
comments[0].user

comments.each do |comment|
    puts comment.user.name #or whatever
end

OTHER TIPS

This should work:

comments = Comment.joins(:user).includes(:user)

But here's what I think is happening, if you are viewing the output in your console windows, I think that the console output only reflects/inspects the root level object that is returned.

I just did an experiment where I executed the above code. The terminal output recorded that it fetched the comments but didn't mention the associated user. Next, I shutdown the database so that a second query could not be executed against the database, then asked for the associated user, e.g.

comments.user

The console output the user, which proves that it has already been eagerly loaded, because no database connection was attempted.

Comment.select('*').includes(:user)

Ryan Bates has good tutorial on this subject.

http://railscasts.com/episodes/22-eager-loading-revised?autoplay=true

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top