2016-12-20 12 views
1

レコードが作成されるたびに一意の順次ID(パターンに続く)を生成するにはどうすればよいですか?並行性の問題にどのように対処しますか?一意の順次IDを生成

このIDは固定パターンに従ってください。 例:ABC00001、ABC00002、ABC00003など

私は学生IDを生成するためにこれを行い、研究所内の学生IDを順番にしたいとします。私のツールを使用する複数の機関があります。

答えて

3

アクティブレコードを使用している場合は、デフォルトで一意の順次ID(id)が既に作成されており、すべての並行性の問題が処理されます。あなたは、クエリのためにそれを使用する必要がある場合は、別の列には、前方の方法かもしれませんが、あなただけのあなたは、単にのようなあなたのモデルにメソッドを定義することができ、特定の形式で表示する必要がある場合:

class MyModel 
    def my_unique_id 
    "ABC%.5d" % id 
    end 
end 

test = MyModel.create 
test.id #=> 1 
test.my_unique_id #=> "ABC00001" 

test2 = MyModel.create 
test2.id #=> 2 
test2.my_unique_id #=> "ABC00002" 

EDIT

ああ、あなたはInstituteの中で連続する識別子が必要だと言わなかった。 PostgreSQLを使用していますか?もしそうならsequenced gemは良い賭けかもしれない - それはあなたがこれを行うことができますacts_as_sequenceメソッドを追加します。

class Student 
    acts_as_sequenced scope: :institute_id, column: :sequential_id 
    #... 
end 

あなたは、PostgreSQLを使用していない場合は、あなたの中に同時実行のロックに対処する方法を見つける必要があるだろう宝石はポストグルにしか対応していないので、データベースシステムを選択してください(方法についてはhereを参照してください)。

+0

私は実際に学生IDを生成するためにこれをやっており、研究所内の学生IDを順番にしたいと思っています。私のツールを使用する複数の機関があります。上記の方法を使用すると、研究所内の学生は順次IDを取得することが保証されません。 – user1175969

+1

@ user1175969あなたが運が良かったかもしれないpostgresを使用している場合(私の編集を参照)。そうでない場合は、使用しているデータベースシステムにテーブルをロックする方法を調べる必要があります。シーケンスの宝石のソースコードは、インスピレーションを探すのに良い場所です。 – omnikron

+0

私はポストグルを使用しています。本当にありがとう! – user1175969

関連する問題