2010-01-21 6 views
5

DBIx :: Class ResultSource에서 new() 메서드를 사용하여 (잠재적으로 임시) 변수를 만들 때 DBIC 스키마에 지정된 기본값으로 속성을 채우지 않는 것 같습니다 (테이블 생성을 위해 지정한 값) 그 스키마로부터).Perl DBIx :: Class - new()를 사용할 때의 기본값?

현재는 그 클래스

sub new { 
    my $class = shift; 
    my $self = $class->next::method(@_); 
    $self->queue('DEFAULT_QUEUE_VAL') unless $self->queue(); 
    return $self; 
} 

하나 개 같은 클래스 (이 문제 된 첫 번째의 경우)에 대해 하나 개의 디폴트 값을 만드는 (즉, 속성 큐 => DEFAULT_QUEUE_VAL). 그러나 장기적으로 우리는 다양한 기본값을 갖는 몇 개의 DBIC 클래스를 가지며, 모든 다양한 경우에 대해 위의 로직을 복제하는 것을 피하고 싶습니다.

이 작업을 수행 할 수있는 CPAN 모듈/플러그인이 있습니까? 우리는 CPAN에 대한 우리의 (겉으로보기에는 너무) 검색을 보지 못했습니다.

편집 : 코드 샘플에서 일부 가비지가 수정되었습니다. 구식 코드에서 나는 cp'd했다.

+0

기본값이 단순한 값 (예 : SQL 함수 호출)이 아닌 경우이 유형의 기법이 중단된다는 점에 유의해야합니다. 가능한 경우 데이터베이스에 행을 삽입하고 (안전을 위해 트랜잭션 내에있을 수도 있음) 열 값을 다시 쿼리하는 것이 좋습니다. 그 기술이 효과가 없다면 당신이 요구하는 것을해라. – hobbs

답변

2

:

sub new { 
    my $class = shift; 
    my $self = $class->next::method(@_); 
    foreach my $col ($self->result_source->columns) { 
    my $default = $self->result_source->column_info($col)->{default_value}; 
    $self->$col($default) if($default && !defined $self->$col()); 
    return $self; 
} 

가이 똑 바른 앞으로의 때, 훨씬 시점이 아니다 구성 요소.

+0

아주 좋아 보인다. 우리는 사실 이러한 구성 요소를 만들거나 프레임 워크에 실제 변경을하려는 것입니다. 그것에 대한 신용에 관심이 있습니까? – Carl

+0

구성 요소를 제안합니다. 그리고 예;) (CPAN : JROBINSON) – castaway

+0

rock on; 우리가 기부금을 직접내는 데 이상한 몇 가지 문제가 있습니다. 그래서 아마도 우리는 당신을 통해 그것을하는 것에 대해 이야기 할 것입니다. – Carl

0

은 객체 메소드 대신 클래스 메소드로 queue()를 호출하는 코드가 아닙니까? 당신은

$new->queue('DEFAULT_QUEUE_VAL') unless $new->queue(); 

을 찾으시는 것입니까?

편집 - 미안 해요, 그냥 질문을 다시 읽고, 그건 그냥 오타

의 추정 생각 - 기본 값은 SQL 스키마에있는 경우, 당신은뿐만 아니라 객체에서 설정해야합니까 ? 당신이 NULL을 (undef) 통과하면 테이블에 기본값을 얻을거야, 그리고 그 개체를 반영하기 위해 서브 클래스 new() 메서드를 다시 db 행을 읽을 수 설정 (-> discard_changes() 내가 그것을 할 것입니다 생각)

가이에 대한 DBIC 구성 요소가 없습니다, 당신이 비록 기존의 코드에 작은 모드와 함께 할 수있는 것 같습니다
+0

불행히도 사이트 동작은 기본값에 따라 달라집니다. 그러므로 어떤 것도 테이블에 쓰여지기 전에 필요합니다. 즉, 잠재적 인 기록을 작성한 다음 사용자가 조작 한 다음 삭제하거나 제출하여 테이블의 실제 레코드로 변환합니다. – Carl

+0

죄송합니다. '임시 변수'비트가 누락되었습니다. 아침에 너무 일찍 응답했습니다. – plusplus

0

또 다른 접근법은 데이터베이스에 '저장된'필드를 저장하여 저장했을 때 표시하는 것입니다. 보기를 사용하여 저장된 오브젝트와 새 오브젝트를 구별 할 수 있습니다.

이 방법은 속도가 느리지 만 DATETIME 또는 위의 대답에 문제가있을 수있는 기타 DB 관련 기본값을 선택할 수 있습니다.