2012-04-19 1 views
0

dm-timestamps가 created_at 및 updated_at 필드를 자동 설정하기 전에 DataMapper의 유효성 검사가 실행 된 것으로 보입니다. created_at가 비어 있기 때문에DataMapper : dm-timestamps가 dm-validations에서 훌륭하게 재생되지 않습니까?

require 'dm-core' 
require 'dm-migrations' 
require 'dm-timestamps' 
require 'dm-validations' 

class MyResource 
    include DataMapper::Resource 

    property :mykey, Serial, :key=>true 
    property :created_at, DateTime, :required=>true 
    property :updated_at, DateTime 
end 

resource = MyResource.new 
resource.save #fails 

저장이 실패

는 다음과 같은 고려하십시오. 흥미롭게도 "require dm-validations"를 주석 처리하면 문제가 해결됩니다. 물론, ": required => true"는 created_at에서 제거 할 수 있습니다.하지만 그 것이 내가 만든 것이 아닙니다. - created_at이 필요합니다. 그것은 내가 dm-timestamp를 사용하여 자동으로 나를 위해 설정 한 것입니다.

다른 사람이 본 사람이 있습니까? 해결책이 있습니까?

답변

0

대부분 유효성 검사가 실행 된 후 created_at 타임 스탬프가 설정됩니다. 이것은 실제로 유효성 검사에 실패 할 경우 생성되지 않기 때문에 실제로 상당히 합리적인 행동입니다. :required => true은 실제로 아무 것도 사지 않기 때문에 삭제하거나 before_validation 후크를 설정하여 타임 스탬프를 설정할 수 있습니다. 두 번째 옵션은 의도하지 않은 결과를 초래할 수 있습니다. 나는 그렇게 생각하지 않지만 DataMapper에 대해 충분히 잘 알지 못한다.

0

어떤 상황에서 created_at이 NULL 일 것이라고 합리적으로 예상합니까? 데이터베이스의 레코드를 수동으로 조작하지 않으려 고합니다.

그런 경우라면 :required=>true 비트를 생략하고 해당 제약 조건을 데이터베이스에 적용하면됩니다. dm-timestamps하자. 그것은 꽤 견고합니다. 그것은 실용적인 해결책처럼 보입니다. 그들이 말했듯이, "가능한 일을하는 가장 단순한 일을하십시오."

관련 문제