<div dir="ltr"><div>Для меня вообще было вопросом, как сделать нормальную запись полей в БД. Т. е. вот есть объект, часть полей он достаёт из базы, часть — ещё откуда-то. Как сделать, чтобы при апдейте поля через сеттер новое значение автоматом попадало в базу (причём только для нужных полей, тех, которые из базы достали)? Сеттеры при этом, конечно, хотелось иметь дефолтные, не определяя их явно в классе.<br>
<br></div>В итоге решил с помощью трейта, который как-то там хитро пытаеться влезть перед триггером и что-то сделать, но не могу сказать, что меня это решение вдохновляет. К тому же, оно, вроде бы, вешает отдельный кодреф для каждого поля.<br>
<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">если как бд используется DBIx::Class, у него есть 2хсторонние средства inflate/deflate,<br></blockquote>
<div>Если, то, наверное да. :) Но это уже решение на уровне DBIx::Class, а не на уровне Moose/Mouse. <br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">24 сентября 2013 г., 22:59 пользователь Тимур Нозадзе <span dir="ltr"><<a href="mailto:timur.nozadze@gmail.com" target="_blank">timur.nozadze@gmail.com</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Подобную задачу пытался на Moose решить недавно. Красивого способа не нашёл.<br></div>В итоге сделал конвертацию вручную перед записью в БД:<br>
<br>my $attr = $self->meta->get_attribute($field_name);<br>
if ( $attr->should_coerce ) {<br>    my $constraint = Moose::Util::TypeConstraints::find_type_constraint( 'DBField' );<br>    $new_value = $constraint->coerce($new_value);<br></div>}<br><br></div>Код не продакшн, больше для знакомства с Moose. Но вроде работал.<br>

</div><div class="gmail_extra"><br><br><div class="gmail_quote">24 сентября 2013 г., 22:24 пользователь Ivan Petrov <span dir="ltr"><<a href="mailto:i.petro.77.00@gmail.com" target="_blank">i.petro.77.00@gmail.com</a>></span> написал:<div>
<div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">имеется выборка из БД<br>
<br>
{<br>
    name => 'name',<br>
    point => '{ x: 1, y: 2 }'<br>
}<br>
<br>
далее класс<br>
<br>
package Point;<br>
use Mouse;<br>
require JSON::XS;<br>
<br>
has x   => is => 'ro', isa => 'Num';<br>
has y   => is => 'ro', isa => 'Num';<br>
<br>
sub jstr {<br>
    my ($class, $str) = @_;<br>
    my $json = JSON::XS->new->decode( $str );<br>
    return $class->new(x => $json->{x}, y => $json->{y});<br>
}<br>
<br>
package Obj;<br>
use Mouse;<br>
use Mouse::Util::TypeConstraints;<br>
<br>
coerce Point<br>
    => from 'Str',<br>
    => via sub { Point->jstr( $_) };<br>
<br>
has name    => is => 'rw', isa => 'Str';<br>
has point   => is => 'rw', isa => 'Point', coerce => 1;<br>
<br>
из БД в поле point приходит нераспакованный JSON.<br>
<br>
соответственно при помощи coerce мы его распаковываем прозрачно.<br>
выборку из БД просто кормим конструктору Obj.<br>
<br>
все красиво.<br>
<br>
а теперь как сделать красиво чтобы обратно в БД записать?<br>
<br>
<br>
кроме как сериализационный метод у Point есть какие-то<br>
варианты?<br>
<span><font color="#888888">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</font></span></blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><br>-- <br>С уважением, Тимур Нозадзе
</font></span></div>
</blockquote></div><br><br clear="all"><br>-- <br>С уважением, Тимур Нозадзе
</div>