Mysql 方法无法使用Rails ActiveRecord+原始SQL返回平均值

Mysql 方法无法使用Rails ActiveRecord+原始SQL返回平均值,mysql,ruby-on-rails,ruby,sqlite,activerecord,Mysql,Ruby On Rails,Ruby,Sqlite,Activerecord,在完成railstutorial.org之后,我正在学习如何通过构建Rails应用程序来编写代码,我被一个奇怪的问题困住了 该应用程序旨在列出午餐,员工可以通过该应用程序投票决定是否喜欢午餐。午餐属于供应者,供应者属于菜肴 该应用程序还试图成为多租户,因此有一个与该公司关联的成员模型 午餐上所有积极喜欢的总数除以午餐总票数,得出午餐即午餐得分 因此,所有午餐记录都具有提供者id、成员id和午餐分数属性 我的问题是: 我正在尝试获取与特定供应商相关的许多午餐的平均午餐分数。这是my Provide

在完成railstutorial.org之后,我正在学习如何通过构建Rails应用程序来编写代码,我被一个奇怪的问题困住了

该应用程序旨在列出午餐,员工可以通过该应用程序投票决定是否喜欢午餐。午餐属于供应者,供应者属于菜肴

该应用程序还试图成为多租户,因此有一个与该公司关联的成员模型

午餐上所有积极喜欢的总数除以午餐总票数,得出午餐即午餐得分

因此,所有午餐记录都具有提供者id、成员id和午餐分数属性

我的问题是: 我正在尝试获取与特定供应商相关的许多午餐的平均午餐分数。这是my Provider.rb模型中的内容:

def average_member_lunch_score(member_id)
    result = self.lunches.select("AVG(lunchscore) as average_lunchscore").where("date <= ? AND member_id = ? AND lunchscore > 0", Time.zone.now.beginning_of_day, member_id)
    return result.average_lunchscore
end
我得到以下结果:

NoMethodError:   Lunch Load (0.1ms)  SELECT AVG(lunchscore) as average_lunchscore FROM "lunches" WHERE "lunches"."provider_id" = ? AND (date <= '2017-02-05 05:00:00.000000' AND member_id = 2 AND lunchscore > 0)  ORDER BY date ASC  [["provider_id", 1]]
undefined method `average_lunchscore' for #<ActiveRecord::AssociationRelation [#<Lunch id: nil>]>
但是,如果我尝试手动区分average_member_Linch_score方法,并在SQL查询本身中写入,我似乎可以获得大部分方法:

arbys.lunches.select("AVG(lunchscore) as average_lunchscore").where("date <= ? AND member_id = ? AND lunchscore > 0", Time.zone.now.beginning_of_day, 2)
  Lunch Load (0.1ms)  SELECT AVG(lunchscore) as average_lunchscore FROM "lunches" WHERE "lunches"."provider_id" = ? AND (date <= '2017-02-05 05:00:00.000000' AND member_id = 2 AND lunchscore > 0)  ORDER BY date ASC  [["provider_id", 1]]
+----+--------------------+
| id | average_lunchscore |
+----+--------------------+
|    | 0.8136429227338321 |
+----+--------------------+
1 row in set
在我看来,这可能与return方法有关,或者可能是它为id返回了一个空白值,这导致了方法失败,而查询本身似乎是可靠的

我的最终目标是能够在视图中使用此平均值,因此我可以键入如下内容:

<%= @provider.average_member_lunch_score(current_user.member_id) %> 

有人能解释为什么查询有效,但方法失败吗?另外,为什么查询返回id列,即使它不在select语句中

在其他人的帮助下,我最终回答了这个问题。将其分解为原始SQL似乎有问题,因此使用内置的活动记录平均方法使其更加容易和有效

def average_member_lunch_score(member_id)
    return self.lunches.where("date <= ? AND member_id = ? AND lunchscore > 0", Time.zone.now.beginning_of_day, member_id).average("lunchscore")
end

在SQL中,聚合是在WHERE之后进行的;要筛选聚合值,您必须改用:

午餐。选择AvglunchScore作为平均午餐分数。 其中日期0
def average_member_lunch_score(member_id)
    return self.lunches.where("date <= ? AND member_id = ? AND lunchscore > 0", Time.zone.now.beginning_of_day, member_id).average("lunchscore")
end