2009-12-08 17 views
0

레일즈 앱에서 새 모델을 만들었습니다. 다른 테이블과 일대일 관계이므로 새 모델에 ID 열이 있어야 할 필요는 없습니다. 모든 것이 잘 작동하지만, 어떤 이유로이 모델에 대한 모든 Shoulda 테스트가 실패합니다. 예를 들어 :id가없는 모델에서 오류가 발생했습니다.

ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'my_new_table.id' 
in 'field list': SELECT `my_new_table`.id FROM `my_new_table` WHERE 
(`my_new_table`.`some_other_column` IS NULL) LIMIT 1 

합니까 진작은 ID 열이 필요합니다

should_validate_presence_of :first_name 

이 오류를 던지고있다? 그렇다면이 문제를 해결할 방법이 있습니까?

답변

3

레일스의 기본 키에 별칭을 지정 했습니까?

set_primary_key :my_fk_id 
+0

이 속해 있습니까? 검증 및 연관성과 함께 모델에서? – jerhinesmith

0

새 모델을 만든 후 rake db : migrate 및 rake db : test : prepare를 실행 했습니까?

1

레일스는 모델에 정수 ID 열을 기본 키로 포함해야합니다. @MattMcKnight가 제안하는 외래 키에 설정할 수 있지만 엄격하게 필요하지 않더라도 ID 열을 만드는 것이 좋습니다. 내 경험상 기본적으로 단점이없는이 같은 두통의 톤을 절약 할 수 있습니다.

0

모든 테이블에는 ActiveRecord가 작동하는 방식 인 ID 열이 필요합니다. MattMcKnight가 지적한 것처럼 다른 열을 기본 키로 지정할 수 있습니다. create_table에 대한 옵션으로 :id => false을 제공하여 테이블에 ID 열이 없도록 지정할 수도 있습니다.

매트의 대답은 모델 정의에서 기본 키의 이름을 바꿉니다. 마이그레이션에서이 작업을 수행하는 방법은 다음과 같습니다.

id 옵션을 false로 지정하지 않고 기본 키 옵션을 지정하면 블록의 열 정의에 추가 할 필요가 없습니다. Rails가 그것을 만들 것입니다. 그리고 자동으로 모든 조인 테이블에서 사용합니다.

예 :

class CreateTableWithOUtID < ActiveRecord::Migration 

    def self.up 
    create_table :my_new_table, :primary_key => :another_table_id do |t| 
    t.string :some_other_column 
    end 
    end 

    def self.down 
    drop_table, :my_new_table 
    end 
end 
관련 문제