2013-03-28 4 views
1

으로 할당 된 속성을 보지 못합니다. Ruby 및 DataMapper를 시작하면서 생각지 못한 문제가 발생했습니다. 나는 다음과 같은 얻을DataMapper는 @

다음
> foo = Foo.new 
> foo.date 
=> #<Date: 2013-03-28 ((2456380j,0s,0n),+0s,2299161j)> 
> foo.save 

:

class Foo 
    include DataMapper::Resource 

    property :id, Serial 
    property :date, Date, required: true 

    def initialize 
    @date = Date.today 
    end 
end 

내 모델, 데이터베이스 연결을 설정을 테스트하고 새로운 foo는 저장하려고하는 IRB를 엽니의 나는 다음과 같은 모델을 가지고 있다고 가정 해 봅시다 예외 :

DataObjects::IntegrityError: foos.date may not be NULL

그리고 필자는 필요에 따라 날짜를 표시했기 때문에 완벽하게 이해할 수 있습니다. 그러나 날짜는 거기에있다! 나는 그것을 클래스의 생성자에 할당했다! 그리고 오늘 날짜로 초기화하지 않고 저장하려고하면 유효성 오류 만 발생합니다. 예외 없음.

이해가 안 무엇

(이 무엇인지 당신이 대답 할 것은) 내가

self.date = Date.today 

@date = Date.today 

를 교체하면 작동한다는 것입니다! foo가 올바르게 저장되었습니다. 왜 그런가요? DataMapper 내부의 버그입니까?

+0

이것은 DataMapper가 기본 변수가 아닌 setter/getters를 사용할 때만 조작되는 일종의 내부 세트/비 설정 데이터 구조를 유지한다는 것을 의미합니다. – Linuxios

+0

@Linuxios : 논리적 인 방식으로 작동시키는 방법이 있습니까? 현재 작동하는 방식과 매우 직관적입니다. –

+1

당신이 말한 것을 정확히하고'self.date'를 사용하십시오. 인스턴스 변수는 클래스의 가장 내부에있는 부분입니다.이 클래스를 사용하여 DataMapper의 내부 구조와 상호 작용할 경우 화재로 어지럽 힙니다. – Linuxios

답변

1

DataMapper의 사람들과 문제를 제기 한 후에, 설계 상 의도라고 들었습니다. 더티 추적 기능을 사용하려면 절대적으로 속성 작성자를 사용해야하며 인스턴스 변수를 직접 설정하지 않아야합니다.