2010-01-21 37 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搜索中。

編輯:修復了代碼示例中的一些垃圾;事實證明,我從過時的代碼中提取出來了。

+0

值得注意的是,如果您的默認值不是一個簡單的值(例如,它是一個SQL函數調用),此類技術將會中斷。如果可能的話,建議您將行插入數據庫(可能在安全事務中)並查詢列值。只做你所問的是否這種技術不起作用。 – hobbs 2010-07-23 07:50:35

回答

2

它看起來像有對此沒有DBIC組件,你可以用一個小國防部這樣做是爲了您的現有代碼,但:?

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 2010-01-26 16:14:54

+0

我會建議一個組件。並且是的;)(CPAN:JROBINSON) – castaway 2010-01-27 08:01:21

+0

rock on;在我們直接作出貢獻的時候,有一些呃,奇怪的問題,所以或許我們會通過你聊聊。 – Carl 2010-01-30 20:43:28

0

是不是你的代碼調用queue()作爲類方法而不是對象方法?你的意思是

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

編輯 - 對不起,只是重新閱讀問題,並推測這只是一個錯字

一個念頭 - 如果默認值是在SQL模式,那麼你需要設置它的對象,以及?如果你通過NULL(undef),你會得到表中的默認值,並反映在對象中設置subclassed new()方法重新讀取數據庫行( - > discard_changes()將做到這一點想)

+0

不幸的是,網站行爲取決於默認值;因此在將任何事情寫入表格之前都需要它。也就是說,我們正在製作一個潛在的記錄,然後用戶操縱該記錄,然後丟棄或提交 - 這會將其轉化爲表格中的實際記錄。 – Carl 2010-01-21 11:36:33

+0

對不起,錯過了'臨時變量'位 - 在早上過早回答! – plusplus 2010-01-21 13:08:09

0

另一種方法是在數據庫中有一個「保存」字段,您在保存時標記它。您可以使用視圖來區分保存的對象和新的對象。

這種方法會比較慢,但可以讓您選取DATETIME或其他數據庫特定的默認值,以上答案可能有問題。

相關問題