IT

이미 존재하는 Rails 자동 할당 ID

lottoking 2020. 9. 6. 10:17
반응형

이미 존재하는 Rails 자동 할당 ID


다음과 같이 새 레코드를 만듭니다.

truck = Truck.create(:name=>name, :user_id=>2)

내 데이터베이스에는 현재 트럭에 사용할 수있는 방식으로 일부에 ID를 사용할 수 있습니다. 그래서 무슨 일이 일어나고 있는지 레일은 id = 150으로 항목을 만들고 잘 작동합니다. 그러나 ID = 151이 이미 존재하는 것으로 간주됩니다.

ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey" DETAIL: Key (id)=(151) already exists.

다음에는 ID 152를 할당합니다. 해당 값이 아직 적용되지 않은 경우 작동합니다. ID를 할당하기 전에 ID가 이미 존재하는지 확인하기 위해 레일을 얻으려면 어떻게해야합니까?

감사합니다!

편집하다

트럭 ID는 복제되는 것입니다. 사용자가 이미 존재 하며이 경우 상수입니다. 사실 제가 다루어야 할 유산 문제입니다. 한 가지 옵션은 이번에는 레일스가 모든 ID를 자동 할당하도록 테이블을 다시 만드는 것입니다. 몇 가지 다른 문제가 있기 때문에 이것이 최선의 선택이라고 생각하기 시작했지만 Truck은 다른 많은 테이블에서 외래 키이기 때문에이를 수행하는 마이그레이션은 매우 복잡 할 것입니다. 자동 할당 된 ID와 모든 기존 관계를 유지하면서 트럭에 이미 동일한 데이터를 사용하여 레일이 새 테이블을 생성하는 간단한 방법이 있습니까?


Rails는 아마도 내장 PostgreSQL 시퀀스를 사용하고있을 것입니다. 시퀀스의 개념은 한 번만 사용하는 것입니다.

가장 간단한 해결은 다음과 같은 쿼리를 사용하여 company.id 열의 시퀀스를 테이블에서 가장 높은 값 설정하는 것입니다.

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

시퀀스 이름 "company_id_seq", 테이블 이름 "company"및 열 이름 "id"를 추측하고 있습니다 ... 올바른 이름으로 바꾸십시오. 시퀀스 이름을 얻거나 SELECT pg_get_serial_sequence('tablename', 'columname');로 테이블 정의를 볼 수 있습니다 \d tablename.

다른 해결책은 저장하기 전에 새 행에 대한 회사 ID를 수동으로 설정하도록 회사 클래스의 저장 () 메소드를 재정의하는 것입니다.


나는 관리를 위해 문제를 해결했습니다.

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


@Apie 답변을 기반으로 합니다.

다음을 사용하여 작업을 필요할 때 사용할 수 있습니다.

rake database:correction_seq_id

다음과 같은 작업을 생성합니다.

rails g task database correction_seq_id

그리고 생성 된 파일 ( lib/tasks/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

레일스 문제가 아닌 데이터베이스 문제처럼 들립니다. 데이터베이스에 id열에 존재하는 ID가 있습니까? 테스트 결과 데이터베이스에 직접 몇 개의 삽입을 수행하고 동작이 있는지 확인하십시오.


다음 명령 으로이 문제를 해결했습니다.

Rails 콘솔에서 실행

ActiveRecord::Base.connection.reset_pk_sequence!('table_name')

참고 URL : https://stackoverflow.com/questions/11068800/rails-auto-assigning-id-that-already-exists

반응형