Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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
Mysql 如何在ActiveRecord查询中包含不属于group子句的字段?_Mysql_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Mysql 如何在ActiveRecord查询中包含不属于group子句的字段?

Mysql 如何在ActiveRecord查询中包含不属于group子句的字段?,mysql,ruby-on-rails,ruby,ruby-on-rails-3,Mysql,Ruby On Rails,Ruby,Ruby On Rails 3,(Ruby 1.9.3-p429;Rails 3.0.6) 我们对测试排队方式的最新更改已经呈现了我们的最后一个\u id范围: last_ids = tests.where('end_time != 0'). group(:condition1, :condition2, :condition3, :condition4). select('max(id) as id') 逻辑上过时了。以前,测试是按照与创建测试记录相同的顺

(Ruby 1.9.3-p429;Rails 3.0.6) 我们对测试排队方式的最新更改已经呈现了我们的最后一个\u id范围:

last_ids = tests.where('end_time != 0').
                 group(:condition1, :condition2, :condition3, :condition4).
                 select('max(id) as id')
逻辑上过时了。以前,测试是按照与创建测试记录相同的顺序排队和完成的,因此每个分组的最大id也是最新的测试记录。现在,为了提高效率,我们有一个排队算法,不再保证测试的顺序。我在测试表中添加了“结束时间”列。到目前为止,我的解决方案速度太慢,无法使用:

max_end_times = tests.where('end_time != 0').
                        group(:condition1, :condition2, :condition3, :condition4).
                        .maximum(:end_time)
它产生一个哈希:{[:condition0,:condition1,:condition2,:condition3]=>:endtime}。然后我做如下工作:

hash.each_pair do |key, value|
  last_ids << tests.select(:id).
                      where(condition0: [key[0]]).
                      where(condition1: [key[1]]).
                      where(condition2: [key[2]]).
                      where(condition3: [key[3]]).
                      where(end_time: [value]).
                      map(&:id)[0]
end
hash.each_pair do|键、值|

最后一个ID
ActiveRecord::Calculations#Pull

编辑:如果您没有
#pull
,您仍然可以在一个查询中执行此操作&a
#map

tests.where('end_time != 0').
             group(:condition1, :condition2, :condition3, :condition4).
             select('id, max(created_at)').map(&:id)

我看到了Pull…不幸的是,我被困在rails 3.0.6上了。真糟糕。我刚刚看到现在也有一个
#ids
方法,但我认为这在4.0中是新的。现在我想起来了,我不确定Pulk或它的前身是否会起作用。当我通过组和最大值时,id可能会丢失。嗯…关于:编辑(id,最大值(结束时间))?这真是奇怪的事情。我试过这个,结果是:{[21,“UNIT4”,“3930et”,“tengig”]=>2013-07-3105:53:21-0700,[2”,“3940”,“multi”]=>2013-08-0421:56:19-0700}(除其他外)。找不到身份证。这被证明是相当棘手的。是的,对不起,我想我并没有试图输出散列——你们可能想要的是where而不是group?老实说,我不确定这些条件在您的数据模型中应该做什么。所以您只需要每组4个条件中最新测试的ID?你需要把他们和小组配对吗?此外,如果列没有足够的精度,使用
end\u time
可能不可靠,并且随着计算机速度的提高,问题会变得更严重。多个测试可能会在同一时间完成-在平局的情况下,您想要哪个id重要吗?