On Wed, Aug 19, 2009 at 9:44 PM, Eden Cardim <[email protected]> wrote:

> On Sun, Aug 16, 2009 at 12:09 PM, Ovid<[email protected]>
> wrote:
> > Hi all,
> >
> > This should be painfully obvious, but I don't see it :)
> >
> > For a personal project, I want users to be able to click on a letter and
> get a list of countries starting with that letter.  I can do this:
> >
> >    my $letters = $c->model('DB')->storage->dbh->selectcol_arrayref(
> >        'select distinct(substr(name,1,1)) as letter from country order by
> letter'
> >    );
> >    $c->stash->{letters} = $letters;
> >
> >
> > But the country list is static and I want this available at startup.
>  'sub begin' fails because that's called once per request, not once per app.
> >
> > What's the recommend way of handling this?  (I'm using DBIx::Class for
> the model)
>
> package MyApp::Model::DB;
>
> extends 'Catalyst::Model::DBIC::Schema';
>
> has country_letters => (isa => 'ArrayRef', is => 'ro', lazy_build => 1);
>
> sub _build_country_letters {
>  my($self) = @_;
>  return $self->storage->dbh->selectcol_arrayref(
>     'select distinct(substr(name,1,1)) as letter from country order by
> letter'
>  );
> };
>
> sub BUILD { shift->country_letters } # optionally, force load-time
> construction
>
> # in a distant controller
>
> $c->stash->{letters} = $c->model('DB')->country_letters;
>
> --
>   Eden Cardim       Need help with your Catalyst or DBIx::Class project?
>  Code Monkey                    http://www.shadowcat.co.uk/catalyst/
>  Shadowcat Systems Ltd.  Want a managed development or deployment platform?
> http://edenc.vox.com/            http://www.shadowcat.co.uk/servers/


Also FYI it's pretty easy to do something on startup, inside MyApp.pm:

sub run {
  my $c = shift;
  $c->do_stuff();
  $c->SUPER(@_);
}
_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to