Есть ли простой способ отобразить результаты DBIx :: Class на мои собственные классы Moose? - PullRequest
6 голосов
/ 18 февраля 2010

Кажется, мне больно ходить на занятия по лося. Затем использовать DBIx :: Class , чтобы получить набор результатов .. затем вручную сопоставить мой набор результатов с классами Moose.

Ответы [ 3 ]

6 голосов
/ 19 февраля 2010

Если вам нужно сопоставлять классы Moose и схему DBIC, вы можете вместо этого взглянуть на постоянное хранилище объектов, например KiokuDB .

Вы теряете некоторые функции реляционной базы данных, особенно если у вас есть существующая схема, но вы получаете множество функций, основной из которых является тихое отображение между хранилищем данных и вашей объектной моделью. Серверная часть DBI для KiokuDB, вероятно, является лучшим примером такого компромисса. База данных сильно нормализована, но это потому, что она работает так же эффективно, как хранилище ключей.

KiokuDB, однако, может работать с механизмами хранения, которые оптимизированы для такого рода данных. Он поддерживает несколько современных знаменитостей NoSQL, включая CouchDB и MongoDB. Он также поддерживает более старый поклонник BerkelyDB.

Kioku - не решение всех проблем, но оно вполне успешно используется для Parking Mobility для бесперебойной обработки всего хранилища данных.

3 голосов
/ 18 февраля 2010

Вы можете использовать Moose с DBIC без проблем. На самом деле мне нравится использовать MooseX :: Declare, так как я считаю, что расширенный синтаксис очень полезен при разработке твердых общедоступных API, например:

use MooseX::Declare;
class MyApp::Schema::Result::Geo::Division
 extends MyApp::Schema::Result {
    use Locale::Geocode::Division;
 __PACKAGE__->table('division');
 __PACKAGE__->add_columns(
  fk_territory_id => {
   data_type => 'char',
   size => '36',
  },
  division_id => {
   data_type => 'char',
   size => '36',
  },
  code => {
            data_type => 'varchar',
   size => '5',
  },
     created => {
   data_type => 'datetime',
   set_on_create => 1,
  },
 );

 __PACKAGE__->set_primary_key('fk_territory_id','division_id');
 __PACKAGE__->uuid_columns('division_id');
    __PACKAGE__->add_unique_constraint(['fk_territory_id','code']);

 __PACKAGE__->belongs_to(
  territory => 'MyApp::Schema::Result::Geo::Territory',
  {'foreign.territory_id' => 'self.fk_territory_id'},
 );
    method as_geocode_division {
        Locale::Geocode::Division->new($self->code);
    }     
 __PACKAGE__->meta->make_immutable(inline_constructor => 0);
} 1;
1 голос
/ 18 февраля 2010

Похоже, вы описываете именно то, что я написал недавно, чтобы отобразить значения атрибутов Moose на значения Rose :: DB :: Object (с объектом db и objectmanager, содержащимся в приватных атрибутах) и наоборот. Первоначально я использовал триггеры вокруг каждого атрибута Moose для немедленной записи в объект Rose, но позже отказался от этого подхода и лениво записывал значения только при необходимости (то есть во время операции ->save()). Я реализовал это, используя несколько ролей и класс сахара, который автоматически устанавливал черту атрибута, указывающую «Я поле таблицы» для соответствующих атрибутов.

Но не делайте то, что я сделал - просто используйте DBIx :: Class напрямую! В любом случае, следующая основная версия переписывается в Moose, так что я слышу.

...