0

我有两个模型 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. 选择任何击败的最爱 *#a 具有finish_position > 1* 的最爱

确定收藏夹和击败收藏夹的逻辑非常简单(见上文),但我很难将逻辑转换为 activerecord 也是可以使用 activerecord 范围的示例。

这是我最喜欢的尝试:

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

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

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

4

2 回答 2

1

对于收藏夹,您可以使用此

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

对于击败的最爱

beaten_favorites = favorites.where(['finish_position > ?', 1])
于 2013-07-21T13:30:24.160 回答
1

首先是一些原则:

  1. “favorite”和“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
于 2013-07-21T14:26:43.097 回答