[ruby-on-rails] 이미 존재하는 Rails 자동 할당 ID

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

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

내 데이터베이스에는 현재 트럭에 대한 수천 개의 엔티티가 있지만 일부 ID를 사용할 수있는 방식으로 일부에 ID를 할당했습니다. 그래서 무슨 일이 일어나고 있는지 rails는 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는 복제되는 것입니다. 사용자가 이미 존재하며이 경우 상수입니다. 사실 제가 다루어야 할 유산 문제입니다. 한 가지 옵션은 이번에는 rails가 모든 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를 수동으로 설정하도록 회사 클래스의 save () 메소드를 재정의하는 것입니다.


답변

나는 이것을 위해 문제를 해결했습니다.

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')


답변