Should be simple -- will_paginate ordered by acts_as_rated

It seems like this should be very simple and very common.

I’m using “acts_as_rated” plugin to rate images
I’m using mislav-will_paginate gem to paginate a list of images
(not really relevant, but also using paperclip to attach the photo to
the “image” model

I figured I could do something like this:
@images = Image.paginate(:page => params[:page], :per_page => 10, :order
=> ‘rating_avg’)

rating_avg is the name of the average rating in acts as rated

I get this error:
Mysql::Error: Unknown column ‘rating_avg’ in ‘order clause’: SELECT *
FROM images ORDER BY rating_avg LIMIT 0, 10

I’m using the:
:with_stats_table => true
option

What’s the right way to do this rather obvious action of sorting the
output of a rated model and paginating with will_paginate?

thanks,
jp

On Nov 10, 6:48 am, Jeff P. [email protected]
wrote:

rating_avg is the name of the average rating in acts as rated

I’m not familiar with acts_as_rated, however: where is the rating_avg
column ? if it is on some separate table then you’ll need to join on
that table.

Fred

Frederick C. wrote:

On Nov 10, 6:48�am, Jeff P. [email protected]
wrote:

rating_avg is the name of the average rating in acts as rated

I’m not familiar with acts_as_rated, however: where is the rating_avg
column ? if it is on some separate table then you’ll need to join on
that table.

Fred

A little help with this? I never did any stand-alone sql and don’t know
an inner from an outer join.

If the class that we apply acts_as_rated to (“images” in my case) winds
up with a
has_one :rating_statistic

and the rating_statistics model
belongs_to :image

and “rating_avg” is a member of the statistics table…

What would the join look like to :order by :rating_avg ?

thanks,
jp

On Nov 11, 3:07 am, Jeff P. [email protected]
wrote:

Well unless you care particularly about what the join looks like you
can just add :joins => rating_statistic to your find. Do take the time
to familiarize yourself with this sort of stuff though or it will bite
you on the ass eventually.

Fred

On Nov 11, 4:01 pm, Jeff P. [email protected]
wrote:

Frederick C. wrote:

And your suggestion (slightly modified by me [single quotes added to
rating_statistics] gives this

it needs to be a symbol (otherwise it assumes you have constructed the
join statement already).

Fred

Frederick C. wrote:

On Nov 11, 3:07�am, Jeff P. [email protected]
wrote:

Well unless you care particularly about what the join looks like you
can just add :joins => rating_statistic to your find. Do take the time
to familiarize yourself with this sort of stuff though or it will bite
you on the ass eventually.

Fred

Thanks Fred. No joy.

This works fine but doesn’t order anything (obviously):
@images = Image.paginate(:page => params[:page], :per_page => 10)

This
@images = Image.paginate(:page => params[:page], :per_page => 10, :order
=> ‘rating_avg’)
gives me this error:
Mysql::Error: Unknown column ‘rating_avg’ in ‘order clause’: SELECT *
FROM images ORDER BY rating_avg LIMIT 0, 10

And your suggestion (slightly modified by me [single quotes added to
rating_statistics] gives this
@images = Image.paginate(:page => params[:page], :per_page => 10, :joins
=> ‘rating_statistics’, :order => ‘rating_avg’)
Mysql::Error: Unknown table ‘images’: SELECT images.* FROM images
rating_statistics ORDER BY rating_avg LIMIT 0, 10

thanks,
jp