Ruby on Rails:使用数组结果查询

时间:2016-03-19 20:54:24

标签: ruby-on-rails arrays ruby

我确信这对你们很多人来说显然很简单,但作为一个菜鸟,我有一个问题包围着我的大脑。

我有一个名为Season的模型,数据看起来像这样 - (所有字段名都是小写的,如下图所示带帽以便于阅读)

Record  Sport     SeasonNumber
  1     Football   84
  2     Baseball   76
  3     Basketball 52
  4     Hockey     26
  5     Football   85
  6     Baseball   77
  7     Basketball 53
  8     Hockey     27

由于添加数据的方式,我知道Sport列的顺序总是一样。

我有另一个模型,我们称之为Coach,看起来像这样(为了简洁,只显示了我要询问的相关字段。)

Record  Sport      Season  CoachName + otherdata
   1    Football     84    Joe Smith
   2    Football     84    Bob Jones
   3    Football     84    Alex Trebek
   4    Football     84    Computer
   5    Football     84    Computer
   6    Football     84    Computer
   7    Baseball     76    Hank Aaron
   8    Baseball     76    Computer
   9    Football     85    Joe Smith
   10   Football     85    Bob Jones
   11   Football     85    Computer
   12   Football     85    Computer
   13   Football     85    Computer
   14   Football     85    Sam Spade
   ... etc.

我想要做的是,对于Sport / SeasonNumber的最新“组合”[四项运动,只有每项运动的最新季节],得到不是“计算机”的CoachNames数量。

首先,我从季节表中提取最后4条记录

    @seasons = Season.last(4)

现在我想迭代@seasons数组,以获得每个运动在最近一个赛季中人类教练的数量。如果我只有一组“数据”(例如“足球,87”,我可以这样做:

控制器

sp=@seasons.sport
sn=@seasons.seasonnumber
humancount=Coach.human(sp,sn)

模型

scope  :people,  -> {where.not(coachname: "Computer")}

def self.human(sp,sn)
 humans=Coach.people.count.where(["sport = ? and season = ?", sp,sn]) 
end

但是,我想要回归的是一个数组,其中包括“足球人”,“棒球人”,“篮球人”和“曲棍球人”。如何将@seasons的结果/元素传递给方法并获取数组?我试图避免写一个特定于足球的查询,一个用于棒球,一个用于篮球,一个用于曲棍球。

认为答案在于使用.map,但我只是没有意识到它。或者我可能只需要遍历@seasons数组中的每个“记录”?

3 个答案:

答案 0 :(得分:0)

num_human_football_coaches = Coach.where("name != ?", "Computer").where(sport: "Football").count

答案 1 :(得分:0)

你应该这样做

 Coach.where("name != ?", "Computer").group(:sport).count

这会让你得到你想要的东西。

答案 2 :(得分:0)

我最后只是通过“蛮力”来做到这一点。

sn=@seasons.seasonnumber
footballhumancount=Coach.human("football",sn)
baseballhumancount=Coach.human("baseball",sn)
basketballhumancount=Coach.human("basketball",sn)