Forum: Ruby on Rails sorting by subsidiary class

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
DanC (Guest)
on 2009-02-22 17:49
(Received via mailing list)
Hi all,

My app contains categories, service and discounts.

A category has_many :services
A service belongs_to :category and has_one discount
A discount belongs_to :service

On each category show page I list all of the associated services, but
would like to order them by some of the entries in the discount
table.

i.e. in my categories controller

    @category = Category.find(params[:id])
    @services=Service.find(:all, :order => "XXXXXXX", :conditions =>
['category_id = ?', @category.id])

where XXXX relates to one of the columns in the discount table. The
column gives the % discount available stored as an integer field.

Any ideas on best practice here,

I thought I could write a method into the Service.rb model file but
although I can call the value easily I can't order by the entry.

  def reduction
    return discount.percentage
  end

All help appreciated.

Dan C
Sarah Mei (Guest)
on 2009-02-23 06:09
(Received via mailing list)
>    @category = Category.find(params[:id])
>    @services=Service.find(:all, :order => "XXXXXXX", :conditions =>
> ['category_id = ?', @category.id])

@category = Category.find(params[:id])
@category.services.sort! { |x, y| x.reduction <=> y.reduction }
Frederick C. (Guest)
on 2009-02-23 10:45
(Received via mailing list)
On Feb 22, 3:48 pm, DanC <removed_email_address@domain.invalid> wrote:

> i.e. in my categories controller
>
>     @category = Category.find(params[:id])
>     @services=Service.find(:all, :order => "XXXXXXX", :conditions =>
> ['category_id = ?', @category.id])
>
If you join the discounts table you can just order by
discounts.percentage

Fred
This topic is locked and can not be replied to.