在sql order查询结果上按顺序ruby每个循环
我的控制器中有一个运行正常的查询: @klasses\u mon=Klass.order(:start).where(day:'mon')。查找每个 我的结果是(在我的视图中由在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| %>
显示):
\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