gpt4 book ai didi

ruby-on-rails-4 - 为什么Relation.size有时会在Rails 4中返回哈希

转载 作者:行者123 更新时间:2023-12-04 06:36:32 24 4
gpt4 key购买 nike

我可以用两种不同的方式运行查询以返回一个Relation。

当我查询Relation的大小时,一个查询给出了一个Fixnum,另一个查询给出了一个Hash,它是Relations Group By语句中每个值的哈希以及每个值的出现次数。

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

undefined method `zero?' for {}:Hash



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

这是一段代码,其中包含针对两个查询的掠夺性语句以及生成的日志

代码:
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("-----------------------------------------------------------")

日志
-----------------------------------------------------------
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
-----------------------------------------------------------

最佳答案

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

该哈希的键是分组列的值;此哈希的值是各自的计数。

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?,即执行以下操作:
AssessmentResponse.group(:client_id).exists?

代替这个:
AssessmentResponse.group(:client_id).count.zero?

关于ruby-on-rails-4 - 为什么Relation.size有时会在Rails 4中返回哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27956139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com