2012-05-27 2 views
2

DBIx :: Class로 실행 한 문제를 구현하기위한 깔끔한 OO 방법을 찾으려고합니다. 모든 사용자에게 공통된 정보가 포함 된 User 테이블이 있습니다. 각 사용자는 고유 한 필수 정보가있는 많은 다른 클래스를 가질 수 있습니다. 예를 들어, 사용자는 관리자 및 저자 일 수 있습니다. 관리자 및 작성자 클래스에 대한 별도의 테이블이 있습니다.DBIx :: Class abstract parent ResultSet

내가 할 수있게하려는 것은 공통 기본 클래스를 만들어 사용자 개체의 모든 클래스에 액세스하는 것입니다. 따라서 Schema :: UserClass라는 기본 클래스와 Schema :: UserClass :: Admin 및 Schema :: UserClass :: Author라는 두 개의 하위 클래스가 있습니다. 비슷한 문제가 여기에 제시되어

# Get current user 
my $user = MyApp->get_user(); 

# Get user classes 
my @classes = $user->classes->all(); 
for my $class (@classes) { 
    # Print class name 
    print $class->name; 
} 

: http://dbix-class.35028.n2.nabble.com/OO-advice-do-a-subclass-do-something-else-td5614176.html 같은 일이 내가하고 싶은 것은 할 수 있어야한다. 그러나 솔루션은 각 클래스에 대해 새로운 관계를 추가해야하기 때문에 필자가 생각하기에 subpart이다.

모든 하위 클래스에 대한 지식이있는 기본 클래스와 어떻게 관계가 있는지 알 수 없습니다. 어떤 도움이라도 대단히 감사 할 것입니다.

답변

0

내가 찾은 해결책은 훌륭하지 않지만 작동합니다. 시간이 걸리면 CPAN 모듈에서이 코드를 통합하여 좀 더 예쁘게 만들 수 있습니다.

package ParentSchema::Result::Class; 

use strict; 
use warnings; 

use parent 'DBIx::Class::Core'; 

__PACKAGE__->add_columns(
    "user_id", 
    { 
    data_type => "integer", 
    size => 32, 
    is_foreign_key => 1, 
    is_auto_increment => 0, 
    is_nullable => 0, 
    default_value => '', 
    }, 
); 

# stuff common to all schemas 

__PACKAGE__->belongs_to(
    "user", 
    "Schema::Result::User", 
    { 'foreign.id' => "self.user_id" }, 
    { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, 
); 

1; 

package Schema::Result::Class::Author 

use strict; 
use warnings; 

use parent 'ParentSchema::Class'; 

__PACKAGE__->table('class_author'); 

# class spesific stuff 

__PACKAGE__->meta->make_immutable; 

1; 


package Schema::Result::User; 

use strict; 
use warnings; 

use parent 'DBIx::Class::Core'; 

use Module::Pluggable::Object; 
use String::CamelCase qw(decamelize); 

__PACKAGE__->add_columns(
    "id", 
    { 
    data_type => "integer", 
    size => 32, 
    is_auto_increment => 1, 
    is_nullable => 0, 
    default_value => '', 
    }, 
); 

my $class_path = 'Schema::Result::Class'; 

my $mp = Module::Pluggable::Object->new(
    search_path => [ $class_path ] 
); 
my @class_plugins = $mp->plugins; 

foreach my $class (@class_plugins) { 
    (my $name = $class) =~ s/^\Q${class_path}\E//; 
    __PACKAGE__->might_have(
    decamelize($name), 
    $class, 
    { "foreign.user_id" => "self.id" }, 
    { cascade_copy => 0, cascade_delete => 0 }, 
); 
} 

__PACKAGE__->meta->make_immutable; 

1;