>> если как бд используется DBIx::Class, у него есть 2хсторонние средства inflate/deflate, >> > Если, то, наверное да. :) Но это уже решение на уровне DBIx::Class, а не на уровне Moose/Mouse. >
Так это и есть правильный вариант. Каждый сторейдж реализует запись и восстановление так, как ему это не обходимо. Кому-то нужен JSON, кому-то YAML, а кому-то вообще Storable. Понапихать в класс всех возможных сериализаторов и восстановляторов - для базы, для файла, для сети, etc - конечно можно, но имхо это менее православный метод. Тем более, что в DBIx::Class для этого есть специальный компонент: http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/InflateColumn.pod И классические примеры создания своих компонентов на основе InflateColumn: http://cpansearch.perl.org/src/RIBASUSHI/DBIx-Class-0.08250/lib/DBIx/Class/InflateColumn/DateTime.pm http://cpansearch.perl.org/src/BRICAS/DBIx-Class-DateTime-Epoch-0.10/lib/DBIx/Class/DateTime/Epoch.pm И кстати, при реализации inflate & deflate - никто ж не запрещает использовать уже имеющиеся в (Moose-derived) классе конструкторы и методы. 24 сентября 2013 г., 22:11 пользователь Тимур Нозадзе < [email protected]> написал: > Для меня вообще было вопросом, как сделать нормальную запись полей в БД. > Т. е. вот есть объект, часть полей он достаёт из базы, часть — ещё > откуда-то. Как сделать, чтобы при апдейте поля через сеттер новое значение > автоматом попадало в базу (причём только для нужных полей, тех, которые из > базы достали)? Сеттеры при этом, конечно, хотелось иметь дефолтные, не > определяя их явно в классе. > > В итоге решил с помощью трейта, который как-то там хитро пытаеться влезть > перед триггером и что-то сделать, но не могу сказать, что меня это решение > вдохновляет. К тому же, оно, вроде бы, вешает отдельный кодреф для каждого > поля. > > > если как бд используется DBIx::Class, у него есть 2хсторонние средства >> inflate/deflate, >> > Если, то, наверное да. :) Но это уже решение на уровне DBIx::Class, а не > на уровне Moose/Mouse. > > > 24 сентября 2013 г., 22:59 пользователь Тимур Нозадзе < > [email protected]> написал: > > Подобную задачу пытался на Moose решить недавно. Красивого способа не >> нашёл. >> В итоге сделал конвертацию вручную перед записью в БД: >> >> my $attr = $self->meta->get_attribute($field_name); >> if ( $attr->should_coerce ) { >> my $constraint = Moose::Util::TypeConstraints::find_type_constraint( >> 'DBField' ); >> $new_value = $constraint->coerce($new_value); >> } >> >> Код не продакшн, больше для знакомства с Moose. Но вроде работал. >> >> >> 24 сентября 2013 г., 22:24 пользователь Ivan Petrov < >> [email protected]> написал: >> >> имеется выборка из БД >>> >>> { >>> name => 'name', >>> point => '{ x: 1, y: 2 }' >>> } >>> >>> далее класс >>> >>> package Point; >>> use Mouse; >>> require JSON::XS; >>> >>> has x => is => 'ro', isa => 'Num'; >>> has y => is => 'ro', isa => 'Num'; >>> >>> sub jstr { >>> my ($class, $str) = @_; >>> my $json = JSON::XS->new->decode( $str ); >>> return $class->new(x => $json->{x}, y => $json->{y}); >>> } >>> >>> package Obj; >>> use Mouse; >>> use Mouse::Util::TypeConstraints; >>> >>> coerce Point >>> => from 'Str', >>> => via sub { Point->jstr( $_) }; >>> >>> has name => is => 'rw', isa => 'Str'; >>> has point => is => 'rw', isa => 'Point', coerce => 1; >>> >>> из БД в поле point приходит нераспакованный JSON. >>> >>> соответственно при помощи coerce мы его распаковываем прозрачно. >>> выборку из БД просто кормим конструктору Obj. >>> >>> все красиво. >>> >>> а теперь как сделать красиво чтобы обратно в БД записать? >>> >>> >>> кроме как сериализационный метод у Point есть какие-то >>> варианты? >>> -- >>> Moscow.pm mailing list >>> [email protected] | http://moscow.pm.org >>> >> >> >> >> -- >> С уважением, Тимур Нозадзе >> > > > > -- > С уважением, Тимур Нозадзе > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > > -- Sincerely yours, Oleg Kostyuk (CUB-UANIC)
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
