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
- Am I violating MVC here as the database query is being sent (though
not by me directly) in the view?
- 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
- 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 
(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)
- 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.