Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Catalyst: где правильно писать модель?


Автор: Logo 24.1.2011, 16:00
Где в Catalyst нужно записывать свои методы для таблиц DBIx::Class, в lib/MyApp/Schema/Result/Table.pm после строк DO NOT MODIFY THIS OR ANYTHING ABOVE!, или в lib/MyApp/Model/ModelName/Table.pm?

Автор: Logo 27.1.2011, 15:09
Быть может, есть какие нибудь известные приложения на Catalyst, котоыре можно было бы посмотреть?

Автор: xoma 27.1.2011, 16:52
Цитата(Logo @ 27.1.2011,  15:09)
Быть может, есть какие нибудь известные приложения на Catalyst, котоыре можно было бы посмотреть?

 Вот это http://mojomojo.org/ ? https://github.com/marcusramberg/mojomojo - код...

Автор: Logo 28.1.2011, 13:32
Посмотрел, там пишется в Shema, и еще как то отключена контрольная сумма, мешающая изменять автоматически сгенерированную часть.
Но тогда зачем Catalyst bless'ит все объекты DBIx::Class::Row в MyApp::Model::MyDB::Table?

И самое главное как тогда поставить триггер на определенное поле, или создать расширеное поле? 
Оба примера из http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Manual/Cookbook.pod#OVERLOADING_METHODS не работают.
Код

  around number => sub {
    my ($orig, $self) = (shift, shift);

    if (@_) {
      my $value = $_[0];
      $self->squared( $value * $value );
    }

    $self->next::method(@_);
  }

пишет при обращении к полю No next::method 'around' found for MyApp::Model::MyDB::Object at /usr/share/perl/5.10/mro.pm line 26.

Код

  sub description {
      my $self = shift;

      # If there is an update to the column, we'll let the original accessor
      # deal with it.
      return $self->_description(@_) if @_;

      # Fetch the column value.
      my $description = $self->_description;

      # If there's something in the description field, then just return that.
      return $description if defined $description && length $descripton;

      # Otherwise, generate a description.
      return $self->generate_description;
  }

Просто не работает, без сообщений об ошибках.

Автор: vivu 13.2.2011, 13:27
Можно и там и там.

В первом случае lib/MyApp/Schema/Result/Table.pm после строк DO NOT MODIFY THIS OR ANYTHING ABOVE! Лучше записывать что-то относящееся непосредственно к таблице. Например: работу с флагами, манипуляции с данными таблицы и пр.

Второй случай имеет смысл использовать, если нужно повесить какую-то жирную логику. Фактически, это уже будет обособленная от основной модели модель.

...надеюсь я понятно объяснил smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)