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