如何使用超类中的属性对ActiveRecord结果进行排序?

时间:2010-09-17 16:53:57

标签: ruby-on-rails activerecord

我有两种模式:

class Manufacturer < ActiveRecord::Base
  has_many :models
end

class Model < ActiveRecord::Base
  belongs_to :manufacturer
  belongs_to :model
end

我希望能够找到所有型号属于特定类别的制造商:

manufacturers = Model.find(:all, :conditions=>["vehicle_category_id = 1"], :include => :manufacturer, :group => "manufacturer_id").map {|model| model.manufacturer }

但我希望能够按制造商名称(即manufacturer.name

)订购结果

你知道我怎么做吗?

更新

这对我有用,但看起来非常低效,必须是更好的方法:

manufacturers = (Model.find(:all, :conditions=>["vehicle_category_id = 1"], :include => :manufacturer, :group => "manufacturer_id").map {|model| model.manufacturer }).compact.sort{|x,y| x.name <=> y.name} 

1 个答案:

答案 0 :(得分:0)

解决方案1 ​​

Manufacturer.all(
  :condition => [ "EXISTS (
                    SELECT a.id 
                    FROM   models a 
                    WHERE  a.manufacturer_id     = manufacturers.id AND 
                           a.vehicle_category_id = ?
                   )",
                  1
                ],
  :order     => "manufacturers.name"
)

解决方案2

Manufacturer.all(
  :select    => "DISTINCT manufacturers.*",
  :joins     => :models,
  :condition => [ "models.vehicle_category_id = ?", 1],
  :order     => "manufacturers.name"
)
  • 解决方案2使用rails构造。

  • 解决方案1比解决方案2更快。