2013-01-17 4 views
0

발상으로 만든 id 열에 문제가 있습니다. 나는 다음과 같은 명령을 발판 생성 : 'rails generate scaffold scaffoldname name : string id : integer'

rails generate scaffold scaffoldname name:string id:integer 

은 내가 collection_select와 드롭 다운 메뉴에 사용하고 싶어 관계를 위해 해당 ID 열을 사용했다. 이후 레일이 각 테이블에 대해 자동으로 생성하는 ID 때문에 ID 생성이 필요 없다는 것을 알게되었습니다. 레일 ID를 생성 어디

class.relatedClass.id

이 가능 물론이고 자기가 만든 ID로 관련 테이블을 호출하고 싶었

는 그 후 나는이 명령은 테이블도 가능하다는 것을 깨달았다 이 열은 테이블에서 "rowid"로 이름이 지정됩니다.

그래서 나는 마이그레이션과 함께 자체 생성 된 ID 열을 삭제할 수 있어야한다고 생각했습니다. 내가 이것에 대해 생각한 방식은 레일이 관계에 대해 자동으로 ROWID를 사용해야한다는 것입니다. 그러나 자체 생성 된 ID를 삭제 한 후에는 오류가 모두 발생합니다. Rails는 scaffold 명령에 id 열이 지정되지 않은 경우 자동으로 'rowid'열을 사용하는 것을 거부합니다.

class.relatedClass.id을 호출 할 때 나중에 레일스가 자체적으로 만든 ROWID를 사용하는 방식으로 자체 생성 된 ID 열을 삭제할 수 있습니까? 레일 터미널에서

+0

generate 명령에서 "create"가 실수입니까? –

답변

2

실행이 -

rails g migration remove_id_from_scaffoldname id:integer 

rails g migration add_rowid_to_scaffoldname rowid:integer 

이 두 마이그레이션 파일을 생성합니다 - 하나 id 필드를 제거하고 다른 하나는 rowid 필드를 추가 할 수 있습니다.

그리고 레일 터미널이 실행 -

rake db:migrate 

는 또한 레일이 자동으로 id 필드를 만들 수 있지만 기본 키가 아닌 rowid 않습니다.

마이그레이션 파일 - -

create_table :tablename, :primary_key => :rowid do |t| 
# ... 
end 

모형 -

class ModelName< ActiveRecord::Base 
    self.primary_key = "rowid" 
    ... 
end 

참고 레일이 그렇게 여기에 명시 적으로이 같은 정의가 정의 된 기본 키를 사용하도록 제한하려면 : 레일 자동 생성 id을 기본 키로 사용하는 것이 좋습니다. 그렇지 않은 경우 av 그렇게하는 이유.

+0

좋아, 나는 그것을 얻었다 고 생각한다. 내 실패는 레일이 생성하는 id 컬럼이 SQliteManager로 볼 때 모든 테이블에서 볼 수있는 'rowid'라고 생각한 것입니다. 그러나이 열은 excel (1..n)의 행 레이블과 같은 것으로 레일 자체에서 생성 된 것은 아닙니다. 출력을 생성하는 SQliteManager의 sql 쿼리를 봅니다 :'SELECT rowid, * FROM "testmodels"; '. 그 rowid id를 생성하지 않는 힌트를 주셔서 감사합니다! – coderuby

+1

이것은 굉장한 대답입니다, 정말 고마워요. –

1

당신이 할 수있는 한 가지 작업은 아래로 이전을 실행하고, 마이그레이션에서 ID 필드를 제거한 다음 위로 이전을 다시 실행하는 것입니다.당신은 DB의 LS 할 경우

db/migrate/20130117134712_create_scaffoldnames.rb 

이/마이그레이션, 다른 마이그레이션

> ls db/migrate 
20130114170853_create_server_requests.rb 
20130117134712_create_scaffoldnames.rb 

실행할 수있는 표시됩니다 : 당신이 생성 실행하면

, 그것은 같은 마이그레이션 파일 무언가를 만들어 아래로 이전 20130117134712_create_scaffold db를 실행하여 이름 : 이전 버전으로 마이 그 레이션

> rake db:migrate VERSION=20130114170853 

그런 다음 scaffoldnames 이주를 원하는대로 편집하고 db : migrate를 다시 실행하십시오.

저는 항상이 작업을 수행합니다. 트릭은 개발 환경에서 로컬 인 동안 이러한 수정 사항을 잡아내는 것이므로 이러한 작업을 수행 할 수 있습니다. 또한

, 일찍 충분히 잡을 경우, 당신은

rails destroy scaffold scaffoldname 

는 비계 생성을 취소 할 실행할 수 있습니다.

+0

왜'rails generate' 명령에'id : integer'를 포함 시켰습니까? 어떤 종류의 불필요한 복제로 이어질 수 없었습니까? –

+0

아마도 내 대답의 일부가 아니기 때문에 오해의 소지가 있습니다. 질문에 작성자가 인쇄상의 오류라고 주석을 달았습니다. 내 게시물을 더 명확하게 편집 할 것입니다. –

+0

실제로 '작성'은 인쇄상의 오류입니다. 그 죄송합니다! 그것을 바로 잡을 것입니다! – coderuby