2010-12-28 2 views
3

테이블에서 delete_all을하고 다시 삽입하기 시작할 때 기본 키가 증가하는 방식에 문제가 있습니다. 제거 된 테이블과 연관된 다른 모델이 있기 때문에 문제가됩니다. 예를 들어, 컴퓨터가 belongs_to 컴퓨터 인 경우, 컴퓨터 테이블을 삭제하고 컴퓨터를 다시 추가하면 Apple에 현재 컴퓨터의 행에 유아 computer_id가 있으므로 연결이 엉망이됩니다. 컴퓨터의 기본 키를 재설정하여 컴퓨터를 다시 추가 할 때 연결이 그대로 유지되도록하고 싶습니다. 레일에서 어떻게해야합니까?레일에서 프라이 머리 키 아이디를 재설정합니다.

편집 매우 분명히 밝히지 않아서 유감이지만 지금은하고 싶다고 말합니다. 사용자가 컴퓨터 (컴퓨터)와 연결되기를 원합니다. 컴퓨터는 자신의 ID를 가지고 있으며 관리자 만 생성 할 수 있습니다. 컴퓨터 테이블에는 고정 된 양의 컴퓨터가 있습니다.

User 
belongs_to :computer 

Computer 
has_many :users 

내가 직면하고있는 문제는 컴퓨터 테이블이 seeds.rb/rakefile 내에 미리로드되어 있다는 것입니다. 내 애플 리케이션을 시작할 때, 나는 모든 것을 먼저 삭제 한 다음 테이블을 프리로드하는 파일을 실행하기를 원한다. 이렇게하면 사용자가 컴퓨터 테이블에 제공된 컴퓨터 중 하나만 선택할 수 있습니다. 나는이 스크립트를 다시 실행할 수 있기를 원하고 (즉, heroku 콘솔에서 User 테이블을 삭제하지 않고) 각 컴퓨터 (그리고 각 사용자에게)와 연관된 동일한 ID를 여전히 얻고 싶습니다. 나는 이것을 어떻게해야하는지 혼란 스럽다. 이 일을 다르게해야하는지 알려주세요.

+0

이런 종류의 데이터를 씨앗이나 비품 등으로 적재해서는 안됩니다. 그것은 일부 관리 인터페이스를 통해 유지되어야합니다. 두 개의 기본 키를 사용하지 마십시오. 큰 혼란에 빠지게 될 것입니다. – klew

+0

아마도 당신은 무엇을하고 있으며 왜하고 싶은지 설명하려고 시도 할 수 있습니다. – klew

+0

나는 나의 대답을 편집했다 – klew

답변

11

먼저, 그렇게하지 마십시오! 레코드를 변경하려면 테이블의 행을 업데이트하십시오. 그것을 삭제하고 다시 삽입하지 마십시오! 그래도이 작업을 수행하려면 다른 테이블의 모든 관련 행을 삭제하고 컴퓨터와 사과를 모두 삽입해야합니다.

나는 자동 증가 기본 키를 설정하라는 레일 방법을 알고하지 않습니다,하지만 당신은 MySQL을 사용하는 경우 당신은 사용자 정의 쿼리를 실행할 수 있습니다

ActiveRecord::Base.connection.execute('ALTER TABLE tablename AUTO_INCREMENT = 1') 

그것이 가능한 다음 번호로 자동 증가 값을 다시 설정해야합니다.

편집 :

id로 데이터를로드하는 방법

. 씨앗을로드하는 것이 가능할지 모르지만 조명기를 사용하면 도움이 될 수 있습니다. 모든 (

require 'active_record/fixtures' 

Fixtures.create_fixtures("/path/to/directory/where/your/yml/file/is/", "computers") 

하지만 전체 테이블을 재설정합니다 :

First_computer: 
    id: 1 
    name: computer 

Second_computer: 
    id: 2 
    name: dell 

이 그럼 당신은 DB에로드하려면이 옵션을 사용할 수 있습니다 : 당신이 필요로하는 데이터를 computers.yml 파일을 준비하는 것입니다 행이 삭제되고 다시 삽입되지만 ID는 유지할 수 있습니다.

이번에도 데이터를로드하는 것은 좋지 않다는 점을 알려드립니다. 비품/씨앗은 초기 (응용 프로그램을 시작하는 데 필요한) 데이터가있는 DB를 시드하는 데에만 사용해야합니다.

왜이 테이블을 재설정 하시겠습니까?

+0

테이블을 삭제하지 않고 새 컴퓨터를 추가해야한다고 제안 하시겠습니까? 내가 가진 문제는 내가 테이블을 파괴하고 새 컴퓨터를 추가 할 때 사용자가 유아용 컴퓨터를 갖게된다는 것입니다. 데이터를 미리로드하여 ID를 저장하고 스크립트를 실행하여 데이터를로드 할 때마다 동일하게 유지해야합니다. – denniss

+0

조명기로 데이터를 불러 오면 테이블이 재설정됩니다. 또한 ID를 재설정합니다. – klew

+1

이것에 대해 다른 모델 관계를 중계해서는 안됩니다. 그것은 나쁜 생각이다 :). 이 표를 재설정하려는 이유가 아직도 이해가 안되니? 왜 삭제하지 않고 각 필드를 업데이트해야합니까? 아니면 응용 프로그램에서 const 데이터의 일종 경우, 당신은 이것을 사용하여 시도 할 수 있습니다 : https://github.com/jeffp/enumerated_attribute – klew

1

관계를 유지하기 위해 기본 키를 재설정하지 말고 올바른 방법이 아닙니다. 나중에 관계를 유지하면서 소스 테이블을 삭제해야하는 경우 맵핑에 다른 키를 사용하십시오. 예를 들어, 컴퓨터 테이블에 코드 필드를 가지고 관계를 구성하는 데 사용할 수 있습니다. relationships에 foreign_key를 지정했습니다.

+0

나는 그렇게 생각했다. .. 나는 선로가 제공하는 추가 옵션을 사용하려고 노력하고있다. 컴퓨터에 machine_id (Apple의 외래 키로 사용됨)라는 기본 키가 필요하면이 작업을 수행합니까? has_many : 사과, class => 'apple', : foreign_key => 'machine_id' – denniss

+0

@denniss : "Rails 방식"을 따르는 것이 좋습니다. 따라서 항상 id를 기본 키로 사용하십시오. 더 간단 해. 그리고 당신의 예를 들어 맞는지 확실하지 않습니다. 'Apple' 모델/테이블에'machine_id' 칼럼이 있다면 맞을 것입니다. 질문과 테이블 스키마에 두 모델을 모두 추가 할 수 있다면 우리는 더 많은 것을 도울 수 있습니다. – klew

2
삭제할 때 일을 이상한 방법입니다,하지만 당신은 제거하고 관련 테이블의 키를 교체해야하는 경우에는 관련 행을 보존 :dependent => :nullify를 지정 시도 할 수 및 NULL에 대한 외래 키를 설정

:

class Computer 
    has_many :apples, :dependent => :nullify 
end 

class Apple 
    belongs_to :computer 
end 

c = Computer.find(some_id) 
apples = c.apples 
c.destroy # sets each foreign key in apples to NULL 
new_c = Computer.create 
new_c.apples = apples # sets each foreign key to new_c.id 
관련 문제