簡體   English   中英

Perl DBIx :: Class - 使用new()時的默認值?

[英]Perl DBIx::Class - Default Values when using new()?

在DBIx :: Class ResultSource上使用new()方法創建(可能是臨時的)變量時,它似乎不會使用DBIC模式中指定的默認值填充屬性(我們已指定用於從中創建表)模式)。

目前,我們正在為一個這樣的類創建一個默認值(第一種情況,這是一個問題)

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

在該類中(即屬性queue => DEFAULT_QUEUE_VAL)。 但是,從長遠來看,我們有幾個具有各種默認值的DBIC類,我們希望避免為所有情況復制上述邏輯。

有沒有可用的CPAN模塊/插件? 我們沒有看到任何我們(粗略地粗略地)搜索CPAN。

編輯:修復代碼示例中的一些垃圾; 結果我從過時的代碼中獲取了cp'd。

看起來沒有DBIC組件,你可以使用現有代碼的一個小mod來實現:

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;
}

由於這是直截了當的,因此組件沒有多大意義。

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

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

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

思考 - 如果默認值在SQL模式中,那么您是否還需要在對象中設置它? 如果你通過NULL(undef)你將得到表中的默認值,並反映在對象集中的子類new()方法重新讀取db行( - > discard_changes()將做到這一點我認為?)

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

這種方法會較慢但允許您選擇DATETIME或其他特定於數據庫的默認值,而上述答案可能會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM