2010-12-14 4 views
2

셋업은 다음과 같습니다. 레일즈 3.0.1과 PostgreSQL 9.0 데이터베이스를 사용하고 있습니다. 내 모델을 서브 모듈로 구성했습니다.데이터베이스로 PostgreSQL을 사용하여 레일스에 새 객체를 만들 때 ID가 없습니다.

콘솔을 사용하여 새 종류의 객체 (c = ::Physical::Base::Contact.new)를 만들고 저장할 때 객체의 ID가 자동으로 채워지지 않습니다. 데이터베이스에 기록되지만 객체는 가지고 있습니다. 방금 생성 한 것은 PostgreSQL의 시퀀스에 의해 생성 된 ID를 기록하지 않습니다. 테이블을 생성하기위한 마이 그 레이션 스크립트는 다음과 같습니다. 필자는 직접 작성하고 표준 레일 생성 기능을 사용하지 않고 테이블을보다 잘 제어합니다.

표준 PostgreSQL + Rails 동작입니까, 아니면 직접 마이 그 레이션을 작성하여 뭔가가 누락 되었습니까?

class Contact < ActiveRecord::Migration 
    def self.up 
    execute " 
     create table contacts(
     id serial, 
     contact_type_id integer not null check (contact_type_id > 0), 
     value text not null check (length(value) > 0) 
    ) 
    " 
    end 

    def self.down 
    execute " 
     drop table contacts; 
    " 
    end 
end 

답변

2

테이블에 기본 키를 설정했는지, 최근에 같은 문제가 있었으며 매우 실망했습니다. 마이 그 레이션을 사용하여 테이블을 다시 작성하기로 결정하고 기존 테이블에 기본 키가 없다는 것을 알게되었습니다. 일단 내가 그것을 추가, 일들이 예상대로 일했다!

"alter table contacts primary key (id) 추가"와 같은 것이 필요할 것입니다. ActiveRecord는 해당 필드에 기본 키 인덱스가 없다면 이해하지 못하는 것 같습니다.

기본 키 전에 내가 얻을 것 :

ruby-1.9.2-p0 > Job.create 
=> #<Job id: nil, data: nil, timestamp: nil, enqueued_at: nil, started_at: nil, completed_at: nil, status: nil, result: nil, job_queue_id: nil, job_handle: nil, uniq: nil, priority: nil, server_id: nil> 

을 지금은 기본 키를 추가 한 것으로, 그 결과는 다음과 같습니다

ruby-1.9.2-p0 > Job.create 
=> #<Job id: 17937, data: nil, timestamp: nil, enqueued_at: nil, started_at: nil, completed_at: nil, status: nil, result: nil, job_queue_id: nil, job_handle: nil, uniq: nil, priority: nil, server_id: nil> 
관련 문제