我有两个模型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
我试图完成两件事:
确定收藏和打败收藏的逻辑非常简单(见上文),但我很难将逻辑转换为activerecord也是一个例子,可以使用activerecord范围。
这是我最喜欢的尝试:
Starter.joins(:race).where(:finish_position => minimum(finish_position))
这不起作用,但我仍在努力。
我想理想的是拥有一个最喜欢的范围和一个打败的范围。
答案 0 :(得分:1)
对于收藏夹,您可以使用此
favorites = Starter.group(:race_id).having('min(odds)')
对于打败的收藏夹
beaten_favorites = favorites.where(['finish_position > ?', 1])
答案 1 :(得分:1)
起初有些原则:
“喜欢”和“bean_favorites”只有在比赛存在时才有意义。因此,最好是实例方法而不是类方法。
根据单一责任原则,您的种族应该知道不超过一级的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