2012-02-09 2 views
1

나는 레일을 처음 사용 했으므로 나를 도울 수 있기를 바랍니다. 내 창고를 관리 할 응용 프로그램을 만들고 있습니다. 전송 문서 섹션에는 ID를 문서에 할당하는 편집 불가능한 입력란이 필요하며이 ID를 자동으로 증가 시키길 원합니다.Rails 3.1의 텍스트 필드 자동 증가

ID는 접두어 (로그 된 사용자에 따라 변경됨)와 사용자가 전송 문서를 만들 때마다 증가해야하는 정수로 구성됩니다. 예는 더 잘 설명 할 것입니다 :

1) 사용자 "마크는"응용 프로그램에 로그인

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

1) 사용자 "베드로는"응용 프로그램

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

등등에 기록. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까?

+0

하나의 텍스트 입력란에 입력해야합니까? id에 대한 간단한 정수가 있고 모델의 메소드가이 접두어를이 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

Ageed. 지금 편집 중! –

2

시작하기 전에 before_create 필터에서 가장 높은 값을 얻은 다음 새 번호를 생성합니다. 사용자 모델은 사용자 접두사를 가져 오기위한 접두사 방법과 비슷해야합니다. TransportDocument 사용자에 속하는 가정 것을 내가 이런 짓을 할 것이다 :

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 

내가 코드를 테스트하지 않았다하지만 대략 그런 식으로 작업을해야한다. 필드에 접두사를 저장해야하는 경우 실제로 가장 높은 값을 반환하는 것이 약간 지루해집니다.

사용자 당 고유성을 보장하기 위해 document_id 필드에 일부 유효성 검사를 설정하는 것도 좋은 생각입니다.

+0

Thorsten의 코드는 갈 길입니다. 원래 게시물에서 찾고자하는 특정 명명 규칙을 얻기 위해 document_id를 0으로 채울 수 있습니다. –

+0

그래도 트랜잭션 적으로 안전하지는 않습니까? 올바른 환경 (동일한 사용자, 동시 요청)에서는 중복 된'document_id'로 끝날 수 있습니다 (DB 자체에 대해 고유성 제약 조건을 설정하지 않는 한). – cailinanne

+0

@cailinanne : 당신이 그런 엣지 경우에 맞다고 생각합니다. 당신이 말했듯이, DB에 대한 유일한 인덱스가 좋은 아이디어 일 것입니다. 나는 이것이 생성하는 동안 까다로운 예외 처리를 요구할 것이라고 생각한다. 이것이 콜백 큐에 구현 될 수 있는지 확실하지 않은데, 그 이유는 오류가있을 때를 대비하여 다시 시도해야하기 때문입니다. –