Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
在sql order查询结果上按顺序ruby每个循环_Sql_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

在sql order查询结果上按顺序ruby每个循环

在sql order查询结果上按顺序ruby每个循环,sql,ruby-on-rails,ruby,rails-activerecord,Sql,Ruby On Rails,Ruby,Rails Activerecord,我的控制器中有一个运行正常的查询: @klasses\u mon=Klass.order(:start).where(day:'mon')。查找每个 我的结果是(在我的视图中由显示): \nil,:finish=>nil,:batch\u size=>1000,:error\u on\u ignore=>nil}> 但我试图在每个循环中显示它。由于某种原因,它不再订购了。看起来每个循环都没有保留查询结果的顺序: <% @klasses_mon.each do |k| %>

我的控制器中有一个运行正常的查询:

@klasses\u mon=Klass.order(:start).where(day:'mon')。查找每个

我的结果是(在我的视图中由
显示):

\nil,:finish=>nil,:batch\u size=>1000,:error\u on\u ignore=>nil}>
但我试图在每个循环中显示它。由于某种原因,它不再订购了。看起来每个循环都没有保留查询结果的顺序:

<% @klasses_mon.each do |k| %>
    <p><%= k.teacher %>,
    <%= k.name %>
    START: <%= k.start/60 %>:<%= k.start%60 %>
<% end %>

,,
开始::
结果:

莫尼亚,LBT开始时间:10:0

托梅克,骑自行车开始:8:30

阿加,你好开始时间:15:30

我应该怎么做?

来自:

查找每一个(开始:无,结束:无,批量大小:1000,忽略上的错误:无)
[…]
注意:无法设置顺序。在主键(“id ASC”)上自动设置为升序以使批量订购工作。这也意味着此方法仅在主键可排序(例如整数或字符串)时有效

因此,
find_每个
都有明确的文档记录,可以忽略您尝试使用的任何顺序

find_each
不使用LIMIT和OFFSET在结果集中移动批处理窗口,因为随着偏移量的增加,这往往非常昂贵,相反,它按主键排序,并在WHERE子句中包含一个
id>last_one
条件以设置批处理的开始,以及一个LIMIT子句以设置批处理大小。按主键排序和在主键上查询通常都是便宜的,就像限制子句一样

find_each
对于此作业来说是错误的工具,
find_each
用于批处理,但您只是显示了一个简短的记录列表,因此需要一个简单的:

@klasses_mon = Klass.order(:start).where(day: 'MON')
从:

查找每一个(开始:无,结束:无,批量大小:1000,忽略上的错误:无)
[…]
注意:无法设置顺序。在主键(“id ASC”)上自动设置为升序以使批量订购工作。这也意味着此方法仅在主键可排序(例如整数或字符串)时有效

因此,
find_每个
都有明确的文档记录,可以忽略您尝试使用的任何顺序

find_each
不使用LIMIT和OFFSET在结果集中移动批处理窗口,因为随着偏移量的增加,这往往非常昂贵,相反,它按主键排序,并在WHERE子句中包含一个
id>last_one
条件以设置批处理的开始,以及一个LIMIT子句以设置批处理大小。按主键排序和在主键上查询通常都是便宜的,就像限制子句一样

find_each
对于此作业来说是错误的工具,
find_each
用于批处理,但您只是显示了一个简短的记录列表,因此需要一个简单的:

@klasses_mon = Klass.order(:start).where(day: 'MON')
方法
#find_each
忽略任何作用域
顺序
,并强制按主键进行排序(通常是
id
)。这是在中说明的,因为
#find_每个
都需要确保在迭代过程中不会重复任何记录

如果尝试以下操作,您可以在控制台中看到:

> @klasses_mon = Klass.order(:start).where(day: 'MON').find_each
> @klasses_mon.map(&:start) # force the relation to execute and return rows.
Scoped order is ignored, it's forced to be batch order.
Klass Load (0.ms) SELECT "klasses".* FROM "klasses" WHERE "klasses"."day" = 'MON' ORDER BY "klasses"."id"
=> [600, 510, 930]
如果您不希望运行数千行,您可以删除
查找每一行

@klasses_mon = Klass.where(day: "MON").order(:start)
方法
#find_each
忽略任何作用域
顺序
,并强制按主键进行排序(通常是
id
)。这是在中说明的,因为
#find_每个
都需要确保在迭代过程中不会重复任何记录

如果尝试以下操作,您可以在控制台中看到:

> @klasses_mon = Klass.order(:start).where(day: 'MON').find_each
> @klasses_mon.map(&:start) # force the relation to execute and return rows.
Scoped order is ignored, it's forced to be batch order.
Klass Load (0.ms) SELECT "klasses".* FROM "klasses" WHERE "klasses"."day" = 'MON' ORDER BY "klasses"."id"
=> [600, 510, 930]
如果您不希望运行数千行,您可以删除
查找每一行

@klasses_mon = Klass.where(day: "MON").order(:start)

@MUISTOSHORT INTEGER为什么要使用
#查找每个
?你在这里加载数千条记录吗?@DRSE我不知道我会有多少条记录,但不是数千条。。。这是我在寻找一种查询所有MON klass的方法时发现的,但按起始值排序。。。我猜错了吧?什么是替代方案?编辑:找到它:找到一切会更好吗?请看我的答案。您不应该需要
#查找所有
#所有
@muistooshort整数为什么要使用
#查找每个
?你在这里加载数千条记录吗?@DRSE我不知道我会有多少条记录,但不是数千条。。。这是我在寻找一种查询所有MON klass的方法时发现的,但按起始值排序。。。我猜错了吧?什么是替代方案?编辑:找到它:找到一切会更好吗?请看我的答案。你不需要
#find#u all
#all
。我认为这更像是一个效率问题,而不是一致性问题,文档甚至说“注意:从本质上讲,如果其他进程修改数据库,批处理会受到竞争条件的影响”。但是是的,
find_each
不是这份工作的合适工具。是的,理解并同意。我通常认为效率很高,因为该方法专门用于防止一次实例化大量对象集。相反,一次创建一千个左右,这样他们就可以随着循环的进行而进行GCD,不再需要更多。
find_each
的文档一开始就这么说:“循环数据库中的记录集合(例如,使用ActiveRecord::Scoping::Named::ClassMethods#all方法)效率非常低,因为它会尝试一次实例化所有对象。”我认为这更像是一个效率问题,而不是一致性问题,文档甚至说“注意:从本质上讲,如果其他进程正在修改数据库,批处理会受到竞争条件的影响”。但是是的,
find_each
不是这份工作的合适工具。是的,理解并同意。我通常认为效率很高,因为该方法专门用于防止一次实例化大量对象集。相反,一次创建一千个左右,以便在循环进行一段时间后可以对其进行GCD