2013-03-07 3 views
0

레일을 처음 사용하여 다음 문제로 고생했습니다.레일스 영구 클래스 변수

사람이 읽을 수있는 고객 ID가 필요합니다. 고객 클래스는 단일 테이블 상속 설정에서 연락처 클래스의 하위 클래스이므로 데이터베이스 생성 ID는 선형으로 오름차순으로 유용하지 않습니다.

일종의 카운터/ID (고객이 삭제할 수있는 계산 방법이 아님)를 구현하려면 클래스 변수 또는 전역 변수가 필요하다고 가정합니다. 나 맞아? 이 경우 클래스 변수는 어떻게 든 데이터베이스에 저장해야합니다.

나는 약간은

  • 때 정확히를 증가 저장하는 방법을
    1. 에 손실입니다 : 내가 처음 슈퍼를 호출하는 새로운 방법, 를 오버라이드 (override) 할 필요가? 응용 프로그램이 필요로하는 경우에 값을로드하는 방법
    2. 은 어떤 점

    에서 를 다시 시작해야합니다.

    대신 Multible Table Inheritence 설정을 선호하고 데이터베이스 ID를 사용해야합니까? 두 클래스 모두에서 필드의 90 % 이상이 동일하므로 불만이들 것입니다.

  • 답변

    1

    왜 ID가 선형입니까? 그리고 왜 선형 적이 지 않은가요?

    나는 당신이 어딘가에 잘못 그러나 다만 경우에 나는 당신을 오해,이 같은 일을 마이그레이션 (고객 테이블에 속성 'generatedID을'추가)를 추가하는 방법을 쓸 수 있다고 생각 :

    def generateID 
        if Customer.all.count == 0 
        1 
        else 
        Customer.last.generatedID + 1 
        end 
    end 
    
    당신이 고객의 개체를 저장할 때

    다음 :

    @customer = Customer.new(params[:user]) 
    @customer.generatedID = generateID 
    @customer.save! 
    

    을하지만 이것은 정말 나쁜 방법입니다, 당신은에 allways '개체의 ID를 읽고 사용자에게 보여주고, 나는이 같으면 정말 모르겠습니다 수 t는 선형이다.

    +0

    귀하의 솔루션은 고유 한 ID를 생성하지 않습니다. 마지막 고객이 삭제되기 전에 마지막 고객이 삭제 된 시점. 쉽게 식별 할 수있는 ID를 가지고 고객을 신속하게 구분하고자하는 것은 내 고객을위한 것입니다. DB에서 생성 된 ID를 사용하면 그 ID는 다른 연락처 개체의 ID와 혼합됩니다. 그 이유는 선형이 아니기 때문입니다. 솔직히 솔루션을 좋아하지 않습니다. –

    +0

    솔루션을 사용해 보았지만 테스트 중에 "모두"호출에서 DB 오류가 발생하여 완전히 손실되었습니다. 클라이언트 ActiveRecord :: StatementInvalid : PGError : ERROR : 테이블 "clients"에 대한 FROM 절 항목이 누락되었습니다. LINE 1 : ... "WHERE"가 "."("클라이언트") ORDER BY clients.na ... ^ : SELECT "연락처". * FROM "연락처". "입력"IN "(클라이언트)"ORDER BY 클라이언트. 이름 DESC –

    +0

    테이블 (STI)은 분명히 테이블 클라이언트를 찾습니다. 연락처가 있지만 유형이 클라이언트라고합니다 ... 레일 오류입니까? –