DBIx::Class и методы доступа к перегрузке

(Аналогично, но с более конкретными деталями, #11526999)

Мои классы результатов были созданы с использованием dbicdump, однако я хочу перегрузить метод доступа по умолчанию для поля date.

Работает, но фигня

Чтобы проверить мою идею, я просто добавил атрибут accessor к созданному ключу date вызова add_columns:

__PACKAGE__->add_columns(
  "stamp_id",
  {
    data_type         => "integer",
    is_auto_increment => 1,
    is_nullable       => 0,
    sequence          => "timestamp_stamp_id_seq",
  },
  "date",
  { data_type => "date", is_nullable => 0, accessor => '_date' },
);

... и создал мою процедуру доступа под строкой контрольной суммы Schema::Loader:

# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nB5koMYAhBwz4ET77Q8qlA

sub date {
  my $self = shift;
  warn "overloaded date\n"; # Added for debugging
  my $date;

  # The date needs to be just the date, not the time
  if ( @_ ) {
    $date = shift;
    if ( $date =~ /^([\d\-]+)/ ) {
      $date = $1
    }
    return $self->_date($date)
  }

  # Fetch the column value & remove the time part.
  $date = $self->_date;
  if ( $date =~ /^([\d\-]+)/ ) {
      $date = $1
  }

  return $date;
}

Это работает, так как возвращает ожидаемое 2014-10-04, но это обман.

Делай это правильно

Проблема в том, что я взломал код контрольной суммы, поэтому я не могу аккуратно повторно сгенерировать свои объекты класса.

Чтение ResultSource и CookBook выглядит следующим образом:

Стандартно создайте ResultSource с помощью dbicdump:

__PACKAGE__->add_columns(
  "stamp_id",
  {
    data_type         => "integer",
    is_auto_increment => 1,
    is_nullable       => 0,
    sequence          => "timestamp_stamp_id_seq",
  },
  "date",
  { data_type => "date", is_nullable => 0 },
);

.... добавьте изменить метод доступа под строкой, используя +, чтобы указать, что это изменение существующего определения:

# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nB5koMYAhBwz4ET77Q8qlA

__PACKAGE__->add_columns(
  "+date", { accessor => '_date' },
);

.... используйте метод перегрузки, как и раньше

Не работает.

Я дважды проверил свое правописание, я попробовал add_column, а не add_columns, и я попытался поставить второй add_columns непосредственно под первым - теперь все работает.... код использует метод доступа по умолчанию и возвращает 2014-10-04T00:00:00

Как переопределить метод доступа по умолчанию, чтобы я мог использовать свой собственный метод?

Спасибо...


person CodeGorilla    schedule 10.11.2015    source источник


Ответы (2)


Здесь вам нужна col_accessor_map, переданная в как вариант загрузчика.

col_accessor_map => {
  table_name => {
    date => _date,
  }
}

Вы можете передать параметры загрузчика в dbicdump с помощью -o.

$ dbicdump -o col_accessor_map="{ table_name => { date => _date } }" ... other options ...

(Замените table_name выше на имя вашей таблицы — это же очевидно, верно?)

Обновление: это сообщение было опубликовано непроверенным, и когда я, наконец, дошел до его тестирования, я обнаружил, что оно не работает. После разговора с автором в IRC мне сказали, что опция col_accessor_map не поддерживает этот подход с вложенным хэшем. , поэтому, если вы хотите использовать этот подход, вам нужно будет использовать coderef.

Однако автор также согласился с тем, что добавление этой поддержки было бы хорошей идеей, и я только что вернулся с обеда, чтобы найти этот Github commit, который добавляет эту функцию. Я не знаю, как скоро он попадет на CPAN.

Это может быть первый раз, когда CPAN был обновлен, чтобы сделать ответ SO правильным :-)

person Dave Cross    schedule 10.11.2015
comment
что-то не так с подходом, который я использовал? Документация, кажется, подразумевает, что это правильный путь... - person CodeGorilla; 13.11.2015
comment
Я не вижу в документации ничего, что подразумевало бы, что ваш синтаксис add_columns("+date" ...) будет работать. - person Dave Cross; 13.11.2015
comment
metacpan.org/pod/ описывает использование перегрузки метода доступа и третий абзац metacpan.org/pod /DBIx::Class::ResultSource#add_columns относится к ('+col1') — я добавил их вместе и предположил, что могу добавить этот синтаксис в пакет ResultSource - person CodeGorilla; 13.11.2015
comment
Ты прав. Позвольте мне взглянуть и посмотреть, смогу ли я решить, в чем проблема. - person Dave Cross; 13.11.2015
comment
Обновлен DBIx::Class::Schema::Loader до версии 0.07044 (или выше), чтобы получить функциональность col_accessor_map. Затем добавьте -o col_accessor_map="{ table_name => { date => '_date' } }" в командную строку (и обратите внимание на кавычки вокруг _date — важно!) - person CodeGorilla; 18.02.2016
comment
Да. Вот коммит, который устранил проблему: github.com/dbsrgits/dbix- загрузчик-схемы-класса/фиксация/ - person Dave Cross; 18.02.2016

Я считаю, что на другом уровне абстракции вы могли бы использовать модификатор метода

use Class::Method::Modifier; # or Moose/Moo
around date => sub {...};
person ashley    schedule 11.11.2015