[Catalyst] Configuring individual models via config file with
DBIx::Class:Schema
Tomas Doran
bobtfish at bobtfish.net
Wed Mar 24 00:49:58 GMT 2010
On 22 Mar 2010, at 19:15, Alan Schwartz wrote:
>
> I have an application using DBIx::Class::Schema. In the application
> config file, I have:
>
> <Model::DB>
> schema_class MyApp::Schema
> <connect_info>
> ...various necessary stuff here...
> </connect_info>
> </Model::DB>
>
> <Controller::One>
> someattribute value
> </Controller::One>
>
> <DB::Two>
> anotherattribute anothervalue
> </DB::Two>
>
>
> The first two of these blocks do what I expect -- my models
> get build from the Schema/Result files, I get connections, etc.
> And in Controller/One.pm, I can access $self->{someattribute}
>
To start with, don't do that!
Make a _real_ attribute, e.g.
has someattribute => ( is => 'ro' );
and then call the proper accessor, e.g.
$self->someattribute;
> But I can't for the life of my figure out how I can get
> anotherattribute
> into the config for an individual model based on the schema.
The problem you are having is that your mental model is broken. Your
entire DBIC schema is _one_ model. There is not one model per table in
your DB.
The DBIC model does some trickery as a shortcut for you - so that you
can say $c->model('DB::Person') rather than $c->model('DB')-
>resultset('Person').. However everything under the top level model
class is owned and controlled by that class, it's not a separate model
and so the normal rules don't really apply. :(
> That is, I'd like methods in DB::Two objects to have access
> to $self->{anotherattribute}
>
> In addition to the above, I have tried:
>
> * Variations on the config block (<myapp::Model::DB::Two>,
> <Model::DB::Two>,
> <Two>, even <MyApp::Schema::Result::Two>)
> * Putting that block within the <Model::DB> block, again with all
> those variations
If you just put the attribute directly on your Schema (rather than a
specific resultset), then what you want will (I think, off the top of
my head having not looked) it'll all just work.
You can trivially get back to the schema from the resultset, and (if
it's more convienient) add a delegate method in the resultset to get
the attribute from the schema.
> I haven't found the answer so far in searching this mailing list
> or the web. Is this possible? What am I missing here?
> Thanks in advance!
Hop on irc into #catalyst or #dbix-class and people will be extremely
happy to lead you through sorting out what you want to achieve (whilst
also being architecturally correct) if you're prepared to write a
sentence or two (perhaps even an entire paragraph?) for the docs to
explain this to the next person who comes along?
Cheers
t0m
More information about the Catalyst
mailing list