복붙노트

[RUBY-ON-RAILS] 이미이 존재하는지 자동 할당 ID를 레일

RUBY-ON-RAILS

이미이 존재하는지 자동 할당 ID를 레일

그래서 같은 새 레코드를 만들 :

트럭 = Truck.create (: 이름 => 이름 : USER_ID => 2)

내 데이터베이스는 현재 트럭 수천 개의 요소를 가지고 있지만, 나는 ID가 약간의 ID를 사용할 왼쪽 방식으로, 그들 중 몇 가지에의 할당. 그래서 무슨 일이 일어나고은 레일 ID = 150 항목을 만듭니다하고 그것을 잘 작동합니다. 그러나이 항목 및 할당 그것을 아이디 = 151을 만들려고하지만이 오류를보고 있어요 그래서 ID가 이미있을 수 있습니다 :

액티브 :: RecordNotUnique (PG : 오류 : ERROR : 중복 키 값은 고유 제한 조건 "companies_pkey"을 위반 상세 : 키 (ID) = (151) 이미 존재합니다.

그리고 나는이 작업을 실행할 때, 그것은 단순히 값이 이미 가지고 있지 않은 경우 벌금을 작동합니다 ID (152)를 지정합니다. 어떻게 레일 그것을 할당하기 전에 ID가 이미 존재 여부를 확인받을 수 있나요?

감사!

편집하다

트럭 ID가 중복되는 것입니다. 사용자가 이미 존재하고이 경우 상수이다. 사실은 내가 처리해야하는 기존의 문제입니다. 하나의 옵션은,하자 주위의 모든 ID를 할당이 시간을 자동으로 레일에서 테이블을 다시 작성하는 것입니다. 나는 몇 가지 다른 문제가이기 때문에이 최선의 선택이 될 수있다 생각하기 시작 해요,하지만 트럭은 많은 다른 테이블에서 외래 키가 있기 때문에이 작업을 수행하는 마이그레이션은 매우 복잡 할 것이다. 자동 할당 된 ID의 기존의 모든 관계를 유지하면서, 레일 이미 트럭에 저장 같은 데이터를 새 테이블을 만들 수있는 간단한 방법이 있을까요?

해결법

  1. ==============================

    1.레일은 아마 내장 PostgreSQL의 순서를 사용하고 있습니다. 시퀀스의 아이디어는 한 번만 사용된다는 점이다.

    레일은 아마 내장 PostgreSQL의 순서를 사용하고 있습니다. 시퀀스의 아이디어는 한 번만 사용된다는 점이다.

    가장 간단한 솔루션은이 같은 쿼리 테이블에서 가장 높은 값으로 당신의 company.id 열의 순서를 설정하는 것입니다 :

    SELECT setval('company_id_seq', (SELECT max(id) FROM company));
    

    나는 당신의 순서 이름 "company_id_seq"테이블 이름 "회사"및 열 이름 "ID"추측하고 ... 올바른 배터리로 교체하십시오. 당신은 선택의 pg_get_serial_sequence와 시퀀스 이름을 얻을 수 있습니다 ( 'TABLENAME을', 'columname'); 또는 \ D TABLENAME와 테이블 정의를 봐주세요.

    또 다른 해결책은 수동으로 저장하기 전에 새 행에 대한 회사 ID를 설정하려면 기업 클래스의 저장 () 메소드를 오버라이드 (override)하는 것입니다.

  2. ==============================

    2.나는 나를 위해 문제를 해결하는 이런 짓을.

    나는 나를 위해 문제를 해결하는 이런 짓을.

    ActiveRecord::Base.connection.tables.each do |t|
      ActiveRecord::Base.connection.reset_pk_sequence!(t)
    end
    

    나는 reset_pk_sequence를 발견! 이 스레드에서. http://www.ruby-forum.com/topic/64428

  3. ==============================

    3.@Apie 응답 기준으로합니다.

    @Apie 응답 기준으로합니다.

    당신은 작업을하고 당신이 필요로 할 때 실행할 수 있습니다 :

    rake database:correction_seq_id
    

    이 같은 작업을 만듭니다

    rails g task database correction_seq_id
    

    그리고 (lib 디렉토리 / 작업 / database.rake) 생성 된 파일에 넣어 :

    namespace :database do
        desc "Correction of sequences id"
        task correction_seq_id: :environment do
            ActiveRecord::Base.connection.tables.each do |t|
                ActiveRecord::Base.connection.reset_pk_sequence!(t)
            end
        end
    end
    
  4. ==============================

    4.나에게 소리는 데이터베이스 문제가 아니라 레일 문제를 좋아한다. 그것은 당신의 데이터베이스는 id 컬럼에 부적절한 정체성 씨앗 수있다인가? 테스트에 데이터베이스에 직접 커플 삽입을하고 시도하고 같은 문제가있는 경우를 참조하십시오.

    나에게 소리는 데이터베이스 문제가 아니라 레일 문제를 좋아한다. 그것은 당신의 데이터베이스는 id 컬럼에 부적절한 정체성 씨앗 수있다인가? 테스트에 데이터베이스에 직접 커플 삽입을하고 시도하고 같은 문제가있는 경우를 참조하십시오.

  5. ==============================

    5.나는 명령에 따라이 문제를 해결.

    나는 명령에 따라이 문제를 해결.

    당신의 레일 콘솔이 실행

    ActiveRecord::Base.connection.reset_pk_sequence!('table_name')
    
  6. from https://stackoverflow.com/questions/11068800/rails-auto-assigning-id-that-already-exists by cc-by-sa and MIT license