Further to my question on inheritance, I have been trying subclassing and the 
proxy method options and have a couple of other questions.


First, in an attempt to try the single flattened style where all Foo object 
reside in one table, I tried the cookbook entry on "Dynamic Sub-classing 
DBIx::Class proxy classes".

I set up a db table called foo, created a Foo class with an inflate_result() 
method and a Foo::Noisy class that inherited from the Foo class.

I can now create the Foo object and have it inflate into a Foo::Noisy class.

But, I cant get a Foo::Noisy resultset.

I thought maybe I could define Foo with only the common columns, then create a 
Foo::Noisy subclass that would inherit the columns of Foo and then I could 
create a default value for 'type' and use add_columns() to define the 
additional NoisyFoo column 'decibels'.

But it seems the only resultset I can get is for Foo. So anyone creating 
objects could inadvertently set a 'colour' for a NoisyFoo or a 'decibel' for 
ColouredFoo.





The second thing I tried was to create 3 separate tables for Foo, NoisyFoo and 
ColouredFoo. Then I created a Foo::Noisy class with a has_one relationship to 
the Foo class using a proxy=>[] defined to allow transparent setting/getting of 
the 'name'.

This works to a degree in that I can do :

my $nf = $schema->resultset('Foo::Noisy')->create({id=>1, decibels=>110});
$nf->name('mynoisyfoo');

But it fails if I try to do:
my $nf = $schema->resultset('Foo::Noisy')->create({id=>1, decibels=>110, 
name=>'noisyfoo'});

Giving the error:
DBIx::Class::ResultSet::create(): No such column name on DB::Foo::Noisy

The proxy doesn't seem to be in affect during creation.

Also, if I *don't* set the name, I don't get a row in the Foo table.
Is there a way to enforce that the row is created?

Otherwise, if I want to search for all Foos, I cant do it on the common table.

Is there anyway to ensure the Foo row is created and grn can be passed on 
create?





> -----Original Message-----
> From: Howe, Tom (IDEAS PRACTICE AREAS)
> Sent: 21 January 2009 09:42
> To: DBIx::Class user and developer list
> Subject: [Dbix-class] Inheritance question..
>
> Class structure is something like this..
>

+------+    +------------+              +-------------+
|  Bar |---o|  Relation  |o - - - - - - |     Foo     |abstract
+------+    +------------+              +-------------+class
|  id  |    |   attrs    |o             |      id     |
| name |    +------------+ \_________   |     name    |
+------+                    \        \  +-------------+
                             \        \___^_____    ^
                              \           |     \   |
                               \ +------------+  +-------------+
                                \|  NoisyFoo  |  | ColouredFoo |
                                 +------------+  +-------------+
                                 |     id     |  |     id      |
                                 |  decibels  |  |    color    |
                                 +------------+  +-------------+

> +-------------+
>
> Bar has many Relations
> NoisyFoo has many Relations
> ColouredFoo has many Relations
> Bar many-many NoisyFoos
> Bar many-many ColouredFoos
>
> (Bar many-many Foos?)
>
>
> NoisyFoo and ColouredFoo inherit from Foo
>
> It actually gets more complicated than this because
> - Bar and Foo both inherit from a base object.
> - All objects have a unique id are connected via Relation objects
> - The relation object also contains levels of inheritance
>
> I want to be able to do queries like
>
> 1) Given a Bar, find all related Foo objs
> 2) Given a NoisyFoo or Coloured Foo, find all related Bars
> 3) For all bars with name matching "%str%" find all NoisyFoos
> with decibels > '100'
>
> Im not sure whether it would be better to
> a) retain Foo, NoisyFoo and ColouredFoo as a 3 separate tables,
> b) flatten to 2 tables, so NoisyFoo and ColouredFoo get their
> own name column
> c) flatten all Foos to 1 Foo table and create a Type column
> to differentiate.
>
>
> Questions:
>
>  Is it possible to create Foo, NoisyFoo and ColouredFoo as
> separate tables (a), then create corresponding DBIx proxy
> classes for them in such a way that when I create a new
> NoisyFoo row, the 'name' value is automatically entered into
> the Foo table? And when I retrieve the row it is
> automatically read in from the Foo table?
>
>
> If I were to flatten to 1 table per subclass (b), how would I
> write a relationship that enabled me to perform query (1)
> above; find all Foos for a given Bar.
> --------------------------------------------------------
>
> NOTICE: If received in error, please destroy and notify
> sender. Sender does not intend to waive confidentiality or
> privilege. Use of this email is prohibited when received in error.
>
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive:
> http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk
>
--------------------------------------------------------

NOTICE: If received in error, please destroy and notify sender. Sender does not 
intend to waive confidentiality or privilege. Use of this email is prohibited 
when received in error.

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk

Reply via email to