2011-08-18 7 views
2

オブジェクトを作成した順番で返すことができるようにしたいと思います。明らかに、私はcreated_atフィールドを使ってこれを行うことができますが、これは私がTime.zone.nowをスタブしていつも同じ時間を返すテストスクリプトではうまくいきません。RailsのActiveRecordオブジェクトIDは単調増加することが保証されていますか?

ARは、次のIDが常に最後のオブジェクトより大きいか、削除されたIDを再利用する可能性があることを保証しますか?私はデータベースが両方のタイプの機能を提供していると確信していますが、Railsはデフォルトで何を選択していますか?

EDIT:

テストSQLiteのドライバでは、それが単調であることを示唆しています。テーブル内のすべてのレコードを削除しても、セッションを閉じてセッションを開き、新しいレコードのIDが以前に削除されたオブジェクトのIDよりも大きいレコードを作成しても、しかし私はここでempircalの証拠に頼りたくはありません。誰かがActiveRecordの設計意図について決定的な答えを持っていれば、それは評価されるでしょう。

答えて

3

IDが広告掲載オーダーと一致するとは限りませんが、通常は安全です。

たとえば、削除されたアイテムのために多くの穴が蓄積された非常に大きなデータベースがある場合は、圧縮して基になるシーケンス(またはIDを生成するためにデータベースが使用するもの)をリセットして、値。 Railsはデータベースの実装を使用しますが、あなたのDBA(またはあなたのDBAの帽子をつけているあなた)は制約がありません。

IDは、あなたが苦しんでいるような嫌なデータベースを使用しない限り、短期間に単調増加するはずです。

+0

パラドックス再使用された古いIDの..私を殺した:) – baash05

+0

@daveatflow:それはあなたが苦しんでほしい "嫌なデータベース"に該当するのでしょうか?自分で使ったことはありません。 –

4

アクティブレコードは、IDを指定せずにINSERTを実行し、作成されたIDを取得します。これは、データベース固有の設定であると推測しています。

+0

アクティブレコードソースツリー内に、ID生成にデータベースシーケンスを使用していることがわかっているコードが見つかりました。理論的にはこれは単調性を保証するはずですが、これは実際にはRailsで文書化されていないので、私の分析では不安です – bradgonesurfing

+2

+1:データベース固有です。 – Mchl

関連する問題