如何在rails4 / activerecord中根据父模型中的日期字段来订购查询结果?

时间:2014-08-11 18:33:57

标签: ruby-on-rails activerecord

我有模特

class Run < ActiveRecord::Base
  belongs_to :race
end

class Race < ActiveRecord::Base
  has_many :runs
end

Race有一个日期字段,run有一个名字字段。

我想要一个查询来显示比赛中按日期字段排序的特定名称的所有运行。

我试过以下,但它没有正确排序,结果随机显示。

Run.where(:name => 'foo').joins(:race).order('races.date ASC')

认为问题可能出现在日期字段中我还尝试在Race中基于id进行排序,但结果也不正确。我也尝试在运行后将join作为第一个元素放置,但结果没有变化。

生成的SQL如下:

"SELECT `runs`.* FROM `runs` INNER JOIN `races` ON `races`.`id` = `runs`.`race_id` WHERE (name = 'foo')  ORDER BY odds ASC, races.date ASC"

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:5)

由于您正在为模型使用default_scope,因此Active Record始终首先使用顺序方法“赔率”。除非你真的需要,否则不要使用 default_scope 。使用regular scopes可能会更好(请参阅第14节)。

您也可以使用unscoped,这会使AR“忘记”default_scopes。使用它像:

Run.unscoped.where(:name => 'foo').joins(:race).order('races.date ASC')

还有重新排序方法也会覆盖默认的范围顺序方法:

Run.where(:name => 'foo').joins(:race).reorder('races.date ASC')