# RoR: model on basis of a view on a LEFT JOIN?

**URL:** <https://www.ruby-forum.com/t/ror-model-on-basis-of-a-view-on-a-left-join/77312>\
**Category:** Ruby\
**Created:** [November 26, 2006, 8:51pm UTC](https://www.ruby-forum.com/t/ror-model-on-basis-of-a-view-on-a-left-join/77312 "2006-11-26T20:51:22Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [November 26, 2006, 8:51pm UTC](https://www.ruby-forum.com/t/ror-model-on-basis-of-a-view-on-a-left-join/77312/1 "2006-11-26T20:51:22Z")

</div>

Hi,

I want to make a RoR webapp and on one screen the user should see  
products and his/her own rating:

PRODUCT YOUR RATING  
product100 \<no rating yet, add rating widget\>  
product101 \*\*\*\*  
product102 \*\*  
product103 \<no rating yet, add rating widget\>  
…

So I have a listing over products, but I need to join in the ratings of  
the current user (not of other users).

I think there are 2 approaches:

A. Add a getter method to the model to get the rating (filtered on  
current user)  
B. Make a view from SELECT \* from products LEFT JOIN ratings ON  
products.id = ratings.product\_id AND  
ratings.user\_id = {user.id}

I guess method A will result in 20 queries being fired when a list of  
20 are shown. Not that the webapp will have heavy traffic, but its a  
more clean approach if the database does the heavy lifting in one  
swoop, I think.

So I incline to B, but are there any pitalls when making a activerecord  
model on basis of a VIEW ?

Or perhaps even better solutions are already thought out in Rails.

Thanks in advance,

Harm

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [November 26, 2006, 10:07pm UTC](https://www.ruby-forum.com/t/ror-model-on-basis-of-a-view-on-a-left-join/77312/2 "2006-11-26T22:07:37Z")

</div>

On Nov 26, 2006, at 12:50 PM, removed\_email\_address@domain.invalid wrote:

> ```
> ...
> 
> ```
> 
> products.id = ratings.product\_id AND
> 
> Or perhaps even better solutions are already thought out in Rails.
> 
> Thanks in advance,
> 
> Harm

Assuming you have a model called Product, and a model called Rating  
that belongs\_to Product (and Product has\_many Ratings).

When you lookup the products with Product.find(id) or whatever, just  
use the :include =\> :Rating to make rails do the join. You can then  
in the conditions use the tables you are joining on and it won’t blow  
up. So you should be able to end up with something like:

Product.find(:all, :conditions =\> [“Ratings.user\_id = ?”,  
user.id] , :include =\> :Rating)

I’d have to make sure that worked, but I’m relatively sure that would  
work, although I seem to remember about running into caching issues  
with it. Do a forced reload if you have missing data. To do that,  
you have to do: a\_product.ratings(1) the 1 passed in forces it to  
rehit the database.
