Tables association and accessing them in views - newbie question

Hi
I am new to rails and have a very simple scenario like mentioned here

table: photos
id:int
user_id:int

table: users
id:int
email:string

In the photos model i said it belongs_to :user

When I access the photos.all, I can get the user email by
photos.first.user.email

If I want to display 100 photos on a page, the email is accessed as
above it goes to the database at that time to get the value

  1. Am I violating MVC here as the database query is being sent (though
    not by me directly) in the view?
  2. Since the query goes 100 times in the view, should there be a
    better way to get all the data at once in the controller/model and
    pass all that to the view.

I am coming from PHP world where I used to write queries and there I
used to do a join on photos table and got all the data at once. Is
this join costlier than getting data in each query as above

Thanks
Kiran

Try :include => :user when you request the photos, and that will grab
the user in the same request as the photo.

Walter

On 18 September 2011 01:49, maskiran [email protected] wrote:

When I access the photos.all, I can get the user email by
photos.first.user.email

  1. Am I violating MVC here ?

No you’re not, as it’s the model (via ActiveRecord) doing the query -
that’s exactly how you’re supposed to do it :slight_smile:
(but do try to avoid directly accessing models in views; don’t do
“Photos.first.user.email” in an erb file… have @photos populated
from the controller so you can call @photos.first.user.email in the
view)

  1. Since the query goes 100 times in the view, should there be a
    better way to get all the data at once in the controller/model and
    pass all that to the view.

I am coming from PHP world where I used to write queries and there I
used to do a join on photos table and got all the data at once. Is
this join costlier than getting data in each query as above

As Walter says, :include the :user in the photos query to eagerly load
them. This way Rails will do the DB join and return all the data for
you.