2012-02-09 12 views
1

私はレールが初めてで、あなたが私を助けてくれることを願っています。私は倉庫管理のためのアプリケーションを作成しています。私のトランスポートドキュメントセクションでは、IDを任意のドキュメントに割り当てる編集不可能なフィールドが必要です。このIDを自動的にインクリメントする必要があります。Rails 3.1のオートインクリメントのテキストフィールド

IDは接頭辞(これはログに記録されたユーザーに基づいて変更されます)と、ユーザーが移送文書を作成するたびにインクリメントする必要がある整数で構成されています。アプリケーション

First Transport Document ID: PETE00001 
Second Transport Document ID: PETE00002 

などに記録されたアプリケーション

First Transport Document ID: MARK00001 
Second Transport Document ID: MARK00002 

1)ユーザー "ピーター" にログインし

1)ユーザー "マーク":例では、それより良いを説明します。これを行う方法に関する提案はありますか?

+0

これは1つのテキストフィールドに必須ですか? idの単純な整数があり、User接頭辞をこのidフィールド値とマージしてDocument idを返すメソッドのモデルがあれば、より簡単に処理できます。 –

答えて

2

あなたの記録にbefore_createコールバックにフックすることができます

class TransportDocument << ActiveRecord::Base 
    before_create :set_friendly_id 

    private 
    def set_friendly_id 
     # create your friendly_id here (hard to sample code without knowing your model) 
     # friendly_id = current_user.name.upcase + number_of_records_plus_one_nice_format 
     self.friendly_id = friendly_id 
    end 
end 

あなたは私たちがあなたのモデル構造についての詳細を知る必要があると思いますfriendly_nameを組み立てる助けが必要な場合。

+1

はbefore_createである必要があります。 –

+0

年齢。今すぐ編集! –

2

まず、before_createフィルタで最も高い値を得てから新しい数値を生成します。 ユーザーモデルには、ユーザープレフィックスを取得するためのプレフィックスメソッドのようなものが必要です。私は、コードをテストしていないが、それは大体そのように作業する必要があります

class TransportDocument << ActiveRecord::Base 
    before_create :set_per_user_id 

    def document_id_txt 
    "#{user.prefix}#{document_id}" 
    end 

    private 
    def set_per_user_id 
     val = user.transport_documents.maximum(:document_id) 
     self.document_id = val + 1 
    end 
end 

: はTransportDocumentが、私はこのような何かをするだろう、ユーザーに属していると仮定すると。フィールドにプレフィックスを格納する必要がある場合は、実際の最高値を返すのがやや面倒になります。

ユーザーごとの一意性を保証するため、document_idフィールドにいくつかの検証を設定することも良い考えです。

+0

Thorstenのコードは道のりです。 document_idをゼロで埋めて、元の投稿で探している特定の命名規則を取得することができます。 –

+0

これはトランザクションでは安全ではありませんが、正しいですか?適切な状況(同じユーザ、同時リクエスト)で、重複した 'document_id'で終わる可能性があります(DB自体に一意性制約を設定しない限り)。 – cailinanne

+0

@cailinanne:あなたはそのようなエッジケースについて正しいと思います。あなたが言うように、DB上の一意のインデックスは良い考えです。私は、これが作成中にいくつかトリッキーな例外処理を必要とすると思います。エラーがある場合に再試行する必要があるため、コールバックキューに実装できるかどうかは不明です。 –