0

スターターとレースの 2 つのモデルがあります。

Starter    belongs_to :race
Race       has_many :starters

スターターとレースの属性は次のとおりです。

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

私は2つのことを達成しようとしています:

  1. 各レースで お気に入りを選択します。#特定のレースで、オッズが最も低いスターター*
  2. 打ち負かされたお気に入りを選択します *#finish_position > 1 を持つお気に入り*

お気に入りと打ち負かされたお気に入りを決定するロジックは非常に単純ですが (上記を参照)、ロジックをアクティブレコードに変換するのに苦労しています。これは、アクティブレコードスコープを利用できる例です。

これが私のお気に入りの試みです:

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

これは機能していませんが、私はまだ取り組んでいます。

理想は、お気に入りのスコープと打たれたスコープを持つことでしょう。

4

2 に答える 2

1

最初のいくつかの原則:

  1. 「favorite」と「bean_favorites」は、レースが存在する場合にのみ意味があります。そのため、クラス メソッドではなくインスタンス メソッドの方が適しています。

  2. 単一責任の原則によると、あなたの種族は、スターターの方法を1 レベルしか知らない必要があります。

今コードが来ます

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 に答える
1

お気に入りには、これを使用できます

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

打ち負かされたお気に入りのために

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