Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord查询组和计数零值_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails ActiveRecord查询组和计数零值

Ruby on rails ActiveRecord查询组和计数零值,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个考勤表,我正试图查询,以便创建一个数据集,我可以用它绘制图表。我的表存储考勤信息,如下所示: date | student_id | present | session | -----------|------------|---------|---------| 2012-09-01 | 1 | 1 | AM | 2012-09-01 | 1 | 1 | PM | 2012-09-01 | 2

我有一个考勤表,我正试图查询,以便创建一个数据集,我可以用它绘制图表。我的表存储考勤信息,如下所示:

date       | student_id | present | session |
-----------|------------|---------|---------|
2012-09-01 | 1          | 1       | AM      |
2012-09-01 | 1          | 1       | PM      |
2012-09-01 | 2          | 0       | AM      |
2012-09-01 | 2          | 1       | PM      |
2012-09-02 | 1          | 0       | AM      |
2012-09-02 | 1          | 0       | PM      |
2012-09-02 | 2          | 0       | AM      |
2012-09-02 | 2          | 0       | PM      |
我试图以一个数据集结束,该数据集具有每个唯一的日期,以及当前分数的数量(最终除以2,以准确表示每天的出席人数)

到目前为止,这是我得到的最接近的一次

AttendanceMark.group(:date).count(:conditions => "present = 1")

但是这个结果不包括没有当前标记的日期。我该如何实现这一点呢?

如果分别使用0和1表示现在和缺席,则可以构造如下查询

# For MySQL
AttendanceMark.group(:date).sum('CASE present WHEN TRUE THEN 1 ELSE 0 END')

# For SQLite
AttendanceMark.group(:date).sum('CASE WHEN present = "t" THEN 1 ELSE 0 END')
这会回来的

{ "2012-09-01" => 3, "2012-09-02" => 0 }

稍后,您可以将所有总和除以2。

如果您分别使用0和1表示当前和不存在,则可以构造如下查询

# For MySQL
AttendanceMark.group(:date).sum('CASE present WHEN TRUE THEN 1 ELSE 0 END')

# For SQLite
AttendanceMark.group(:date).sum('CASE WHEN present = "t" THEN 1 ELSE 0 END')
这会回来的

{ "2012-09-01" => 3, "2012-09-02" => 0 }

您可以稍后将所有总和除以二。

这是mysql中的tinyint(1)列,rails将其识别为布尔值,因此它不起作用:(.更新了我的答案。我们必须使用mysql case语句。注意,这与数据库有关。它是tinyint(1)mysql和rails中的列将其识别为布尔值,因此它不起作用:(.更新了我的答案。我们必须使用mysql case语句。请注意,这取决于数据库。