0

ActiveRecordアソシエーションからのレコードが予期しない順序で返されるという問題が発生しています。これは今後修正するのに十分簡単ですが、すでに本番環境にある一部のコードは特定の順序を想定しており、私の場合、その順序は重要です-実際、それは重要です。

私は古いものをこの基本的な問題に修正する方法を絞り込みました:「Enumerable#each」が関連付けでActiveRecordレコードの一貫した順序を返すことが保証されている場合、少なくとも私は一貫して壊れているものを扱っていることを知っています仮定、これは修正可能です。それが保証されていない場合、私は馬鹿にされている可能性があります。

したがって、私の質問は、Ruby Enterprise Edition、リリース2011.03では、Enumerable#eachメソッドは、呼び出した場合と同じ順序でEnumerableの要素を返しますかEnumerable#to_a(で定義された関数Object

githubからREEコードをダウンロードし、このリリースのタグをチェックアウトしました(開発、ステージング、および本番環境で同じバージョンのRubyを使用していることを確認しました)。問題は、Cを読むのが苦手なので、順序は同じだと確信しているとしか言えませんが、Cの読解力はそれほど高くありません。

4

1 に答える 1

1

はい、保証されています。#to_a事実上、結果を収集#eachして新しい配列に返します。

enum_to_aは新しい配列を作成し、それからcollect_allそれ自身のをブロックパラメータとして呼び出しますeachcollect_all単に実行しますrb_ary_push(ary, i);。これにより、指定された値が作成された配列にプッシュされます。Rubyでは、これは次のようになります。

array = []
enum.each {|v| array.push v }

お役に立てば幸いです。

于 2012-12-11T21:24:33.997 に答える