如何使用activerecord的查询界面和范围来识别比赛中的最爱

我有两个模型Starter和Race。

Starter belongs_to :race Race has_many :starters 

Starter和race的属性如下:

 Starter attributes: id, race_id, finish_position, odds Race: id, race_date, race_number, field_size 

我正在努力完成两件事:

  1. 选择每场比赛中的最爱#对于特定比赛,赔率最低的初学者 *
  2. 选择任何打败的collections夹 *#一个有finish_position> 1 *的collections夹

确定collections和打败collections的逻辑非常简单(见上文),但我很难将逻辑转换为activerecord,这也是一个例子,可以使用activerecord范围。

这是我最喜欢的尝试:

Starter.joins(:race).where(:finish_position => minimum(finish_position))

这不起作用,但我仍在努力。

我想理想的是拥有一个最喜欢的范围和一个打败的范围。

对于collections夹,您可以使用它

 favorites = Starter.group(:race_id).having('min(odds)') 

对于打败的最爱

 beaten_favorites = favorites.where(['finish_position > ?', 1]) 

一些原则起初:

  1. “最喜欢的”和“bean_favorites”只有在比赛存在时才有意义。 因此,最好是实例方法而不是类方法。

  2. 根据单一责任原则,您的种族应该知道不超过一个级别的Starter方法

现在是代码

 class Race < ActiveRecord::Base def favorite starters.lowest_odds end def beaten_favorite starters.finished_lowest_odds end end class Starter < ActiveRecords::Base scope :by_odds, order('odds DESC') scope :finished, where('finished_position > 1') def lowest_odds by_odds.last end def finished_lowest_odds finished.lowest_odds end end 

现在来解决这个问题

 @race.favorite @race.beaten_favorite