レコードが作成されるたびに一意の順次ID(パターンに続く)を生成するにはどうすればよいですか?並行性の問題にどのように対処しますか?一意の順次IDを生成
このIDは固定パターンに従ってください。 例:ABC00001、ABC00002、ABC00003など
私は学生IDを生成するためにこれを行い、研究所内の学生IDを順番にしたいとします。私のツールを使用する複数の機関があります。
レコードが作成されるたびに一意の順次ID(パターンに続く)を生成するにはどうすればよいですか?並行性の問題にどのように対処しますか?一意の順次IDを生成
このIDは固定パターンに従ってください。 例:ABC00001、ABC00002、ABC00003など
私は学生IDを生成するためにこれを行い、研究所内の学生IDを順番にしたいとします。私のツールを使用する複数の機関があります。
アクティブレコードを使用している場合は、デフォルトで一意の順次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を参照してください)。
私は実際に学生IDを生成するためにこれをやっており、研究所内の学生IDを順番にしたいと思っています。私のツールを使用する複数の機関があります。上記の方法を使用すると、研究所内の学生は順次IDを取得することが保証されません。 – user1175969
@ user1175969あなたが運が良かったかもしれないpostgresを使用している場合(私の編集を参照)。そうでない場合は、使用しているデータベースシステムにテーブルをロックする方法を調べる必要があります。シーケンスの宝石のソースコードは、インスピレーションを探すのに良い場所です。 – omnikron
私はポストグルを使用しています。本当にありがとう! – user1175969