2012-01-27 2 views
1

스코프 :오류 (이름)이 이렇게 나와 함께 베어 복잡한 예입니다

을 나는 정기적으로 내 dev에 테스트 데이터베이스 내 테이블을 쓸어 것이다 DEV 동안 사용하는 스크립트를 가지고, 다시 이주 그런 다음 다시 시드하십시오. 두 곳에서 트리거를 사용하기 때문에 rake db : RAILS_ENV = test를 마이그레이션하여 테스트 데이터베이스를 올바르게 마이그레이션해야합니다.

내 테스트 환경에서 config.cache_classes = true를 설정하기 전까지는 문제가 없습니다. 그런 다음 레이크 마이그레이션이 빈 데이터베이스에서 실행될 때 테이블이 존재하지 않는 방법에 대한 오류가 발생합니다.

scope :find_by_route_and_date, lambda { |route_id, date| 
    { 
     :conditions=>{:route_id=>route_id, :schedule_date=>date} 
    } 
    } 

, 범위는 람다에, 그래서 평가 받고되어서는 안하지만하십시오 --trace 이것을 실행, 나는 그것이 기본 범위를 선언 할 때의 내 개체 중 하나에 날려 것을 발견 cache_classes를 제거하면 마이그레이션이 올바르게 작동합니다. 그래서 나에게 모델 캐시를 시도하는 것처럼 보입니다. 테이블이 아직 존재하지 않아 범위를 질식 시키며 마이그레이션을 시작하지 않기 때문입니다.

나는 내 마음을 잃어 가고 있습니까? 이걸 본 사람? 데이터베이스를 지울 필요가 있다면 캐싱을 해제하고 마이그레이션 한 다음 다시 켜야합니까?

레일 3.2 루비 1.9.2, 0.9.2.2 퀴

업데이트 : https://gist.github.com/1705064

order.rb가 : 179이있다 요청한 같이

여기 스택 트레이스는 내 첫 번째 범위가 정의 된 위치와 위에 나열된 위치에서 폭파합니다.

+0

스택 트레이스는 무엇입니까? – phoet

+0

요점에 대한 추적에 대한 링크를 포함하도록 편집했습니다. –

+0

나는'order_controller.rb'가 스택에있는 것이 이상하다는 것을 알게되었습니다. 실제로 레이크 작업에서 미친 일을하지 않는지, 실제로 범위를 호출합니까? – phoet

답변

2

이것은 흥미 롭습니다. 스택 추적을 읽을 때 레일스는 기존 스코프를 덮어 쓰면 문제가 발생한다는 것을 알 수 있습니다. 예를 들어 같은 이름의 메서드를 만드는 것입니다.

이것은 범위/메서드 이름이 동적 파인더와 매우 유사하다고 생각하는 respond_to의 활성 레코드를 나타냅니다. 그런 다음 동적 파인더처럼 보이지만 명명 된 속성은 모두 존재합니까? 이것은 존재하지 않는 테이블이 가지고있는 열과 모든 것이 폭발 하는지를 확인하려고 시도하는 곳입니다.

당신 수 (나는 생각한다) 몇 가지 중 하나를 수행합니다

범위 전에
  • , 범위와 같은 이름을 가진 클래스 메소드를 정의하는 respond_to 호출 (우웩) 단락하도록
  • 내가 아직 확실하지 않다 valid_scope_name

당신의 범위 이름

  • 재정을 변경
  • 왜 할 수없는 설정 스키마 파일에서 테스트 DB,에 스키마 댐퍼 설정 필요을 사용하면 활성 레코드가 기본적으로 지원하지 않는 항목이 보존됩니다.

  • +0

    당신은 죽었습니다. 나는 스코프를 파인더처럼 보이지 않게 이름을 바꾸었고 마이그레이션은 잘 돌아갔다. SQL dumper에 대해 살펴 보겠습니다. 트리거가 더 좋은 솔루션이 될 것입니다. 감사! –

    0

    일반적으로 마이그레이션에서 여러 가지 이유로 모델을 참조하면 안됩니다. 가장 주목할만한 점은 모델이 처음 인스턴스화 될 때 테이블 구조에 대한 많은 정보가 캐싱된다는 것입니다. 두 번째로 가장 중요한 문제는 리팩토링 된 앱의 향후 버전에 모델 파일이 존재하지 않을 수도 있다는 것입니다.

    app/models 디렉토리의 상태에 관계없이 항상 작동하는 데이터를 조작하는 저수준 방법을 사용하는 것이 가장 좋습니다. 우수한 마이그레이션 제품군은 누락 된 파일 또는 방법을 사용하지 않고도 초기 상태에서 최신 버전으로 빌드 할 수 있습니다. 그렇기 때문에 자급 자족하는 것이 중요합니다.

    아마도이 범위를 execute과 함께 실행될 수있는 좀 더 리터럴 한 것으로 다시 쓸 수 있습니다.

    test 환경에서 트리거를 사용하는 경우 스키마 덤퍼가 제대로 기록하지 못하기 때문에 스키마 대신 :sql 형식을 사용하십시오. 이것은 좀 더 문자 그대로이며 Ruby 형식의 제한 사항에 의해 영향을받지 않습니다.

    +0

    마이 그 레이션에서 모델을 언급하지 않습니다. 마이그레이션이 완전히 시작되기 전에 이런 일이 발생합니다. –

    +1

    내가 모으는 모델에서 마이그레이션에 사용되지 않습니다 (위험하다고 동의하지만). –

    +0

    이상합니다. 그래도 문제가 생긴 것 같아! – tadman

    관련 문제