首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Relation.size有时会在Rails 4中返回哈希

为什么Relation.size有时会在Rails 4中返回哈希
EN

Stack Overflow用户
提问于 2015-01-15 02:59:45
回答 1查看 1.4K关注 0票数 10

我可以以两种不同的方式运行一个查询来返回一个关系。

当我询问关系的大小时,一个查询按预期给出一个Fixnum,另一个查询给出一个Hash,它是Relations语句中每个值的散列,其中包含每个值的出现次数。

在Rails 3中,我假设它总是返回Fixnum,因为我从来没有遇到过问题,Rails 4有时会返回哈希和类似于Rel.size.zero的语句?给出错误:

未定义的方法“零?”用于{}:散列

我最好只使用.blank吗?方法以检查零记录以确保避免意外错误?

下面是用于这两个查询和结果日志的带有looging语句的代码片段

代码:

代码语言:javascript
复制
assessment_responses1=AssessmentResponse.select("process").where("client_id=? and final = ?",self.id,false).group("process")
logger.info("-----------------------------------------------------------")
logger.info("assessment_responses1.class = #{assessment_responses1.class}")
logger.info("assessment_responses1.size.class = #{assessment_responses1.size.class}")
logger.info("assessment_responses1.size value = #{assessment_responses1.size}")

logger.info("............................................................")

assessment_responses2=AssessmentResponse.select("distinct process").where("client_id=? and final = ?",self.id,false)
logger.info("assessment_responses2.class = #{assessment_responses2.class}")
logger.info("assessment_responses2.size.class = #{assessment_responses2.size.class}")
logger.info("assessment_responses2.size values = #{assessment_responses2.size}")
logger.info("-----------------------------------------------------------")

日志

代码语言:javascript
复制
-----------------------------------------------------------
assessment_responses1.class = ActiveRecord::Relation::ActiveRecord_Relation_AssessmentResponse
   (0.5ms)  SELECT COUNT(`assessment_responses`.`process`) AS count_process, process AS process FROM `assessment_responses` WHERE `assessment_responses`.`organisation_id` = 17 AND (client_id=43932 and final = 0) GROUP BY process
assessment_responses1.size.class = Hash
  CACHE (0.0ms)  SELECT COUNT(`assessment_responses`.`process`) AS count_process, process AS process FROM `assessment_responses` WHERE `assessment_responses`.`organisation_id` = 17 AND (client_id=43932 and final = 0) GROUP BY process
assessment_responses1.size value = {"6 Month Review(1)"=>3, "Assessment(1)"=>28, "Assessment(2)"=>28}
............................................................
assessment_responses2.class = ActiveRecord::Relation::ActiveRecord_Relation_AssessmentResponse
   (0.5ms)  SELECT COUNT(distinct process) FROM `assessment_responses` WHERE `assessment_responses`.`organisation_id` = 17 AND (client_id=43932 and final = 0)
assessment_responses2.size.class = Fixnum
  CACHE (0.0ms)  SELECT COUNT(distinct process) FROM `assessment_responses` WHERE `assessment_responses`.`organisation_id` = 17 AND (client_id=43932 and final = 0)
assessment_responses2.size values = 3
-----------------------------------------------------------
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-15 09:30:33

sizeActiveRecord::Relation对象上转换为count,因为前者试图获取Relation的计数。但是,当您对一个分组的count对象调用Relation时,您将收到一个哈希。

此散列的键是分组列的值;此散列的值是相应的计数。

代码语言:javascript
复制
AssessmentResponse.group(:client_id).count # this will return a Hash
AssessmentResponse.group(:client_id).size # this will also return a Hash

对于following methods是这样的:countsumaveragemaximumminimum

如果要检查是否存在行,只需使用exists?,即执行以下操作:

代码语言:javascript
复制
AssessmentResponse.group(:client_id).exists?

而不是这样:

代码语言:javascript
复制
AssessmentResponse.group(:client_id).count.zero?
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27956139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档