我遇到了一个问题,即ActiveRecord关联中的记录按照我没想到的顺序返回。这很容易解决,但是已经在生产中的一些代码假定某个顺序,而且在我的情况下该顺序很重要 - 事实上它是至关重要的。
我已经缩小了解决这个基本问题的方法:如果“Enumerable#each”保证在一个关联上返回一致的ActiveRecord记录顺序,那么至少我知道我正在处理一贯破碎的假设,这是可以解决的。如果不能保证,那么我可能会受到冲击。
所以我的问题是,在Ruby Enterprise Edition,Release 2011.03中,Enumerable#each
方法是否以相同的顺序返回Enumerable中的元素,就像我调用Enumerable#to_a
一样(Object
上定义的函数{1}}
我从github下载了REE代码,并检查了此版本的标签(我已经确认我在开发,登台和生产环境中使用了相同的Ruby版本)。麻烦的是我阅读C并不是很好,所以我只能说我很有信心订单是一样的,但我的C阅读技巧并不是那么好。
答案 0 :(得分:1)
是的,它是有保证的; #to_a
有效地只收集#each
的结果并将其返回到新数组中。
enum_to_a创建一个新数组,然后将collect_all
作为块参数调用到它自己的each
。 collect_all
只执行rb_ary_push(ary, i);
,将给定值推送到创建的数组。在Ruby中,这将是:
array = []
enum.each {|v| array.push v }
希望有所帮助!