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

时间:2013-07-21 13:22:26

标签: ruby-on-rails ruby ruby-on-rails-3 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. 选择任何打败的收藏夹 * ##具有finish_position>的收藏夹1 *
  3. 确定收藏和打败收藏的逻辑非常简单(见上文),但我很难将逻辑转换为activerecord也是一个例子,可以使用activerecord范围。

    这是我最喜欢的尝试:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

对于打败的收藏夹

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

答案 1 :(得分:1)

起初有些原则:

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

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

  3. 现在出现了代码

    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