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/[email protected]
>
--------------------------------------------------------
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/[email protected]