Re: [Catalyst] Doing work inside the DBIx::Class model
On Thu, Feb 21, 2008 at 01:59:40PM +1000, Cian Barclay wrote: On Wed, Feb 20, 2008 at 4:33 PM, Zbigniew Lukasiak [EMAIL PROTECTED] wrote: He meant result_source: http://cpan.uwinnipeg.ca/htdocs/DBIx-Class/DBIx/Class/ResultSet.html#result_source Thanks Zbigniew and Toby, that's just what I needed to know. Is there a good way to call a class method and get a resultset to use? I'm using Widget::class_method($schema) to give it the schema from $self-result_source-schema. Is there a better way to do it? Yes, don't write class methods in DBIC. If the operation is on multiple rows, make it a resultset method. If the operation is on a single row, make it a method on the row object. If the operation is on a bunch of different things and neither of those make sense, make it a method on the schema object. -- Matt S Trout Need help with your Catalyst or DBIx::Class project? Technical Directorhttp://www.shadowcat.co.uk/catalyst/ Shadowcat Systems Ltd. Want a managed development or deployment platform? http://chainsawblues.vox.com/http://www.shadowcat.co.uk/servers/ ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/
Re: [Catalyst] Doing work inside the DBIx::Class model
On Thu, Feb 21, 2008 at 09:17:33AM +0100, Peter Sørensen wrote: He meant result_source: http://cpan.uwinnipeg.ca/htdocs/DBIx-Class/DBIx/Class/ResultSet.html#result_source But this is not all and it is something that begs for a FAQ entry - I always forget how to do it. The important thing is how to add new methods to the ResultSet: package ArchivedBooks; use base qw/DBIx::Class/; __PACKAGE__-table('books_archive'); __PACKAGE__-source_name('Books'); __PACKAGE__-resultset_class('ArchivedBooks::ResultSet'); package ArchivedBooks::ResultSet; use strict; use warnings; use base qw( DBIx::Class::ResultSet ); sub advanced_search { my ( $self, $params, $attrs ) = @_; $self now is a ResultSet - so you can use methods on it. .. I have a similar problem want - to add some custom methods to the model. I've read your references but still - I can't get this thing to work. I have generated the model using Catalyst and get the following layout: LogParser.pm LogParser | |Components.pm |Connectinfo.pm |Logtype.pm and if I take a look into Components it looks like: package LogParser::Schema::LogParserDB::Components; use strict; use warnings; use base 'DBIx::Class'; __PACKAGE__-load_components(Core); __PACKAGE__-table(components); __PACKAGE__-add_columns( id, { data_type = INT, default_value = undef, is_nullable = 0, size = 11 }, component, { data_type = VARCHAR, default_value = , is_nullable = 0, size = 32 }, regex, { data_type = TEXT, default_value = , is_nullable = 0, size = 65535 }, nvars, { data_type = INT, default_value = 1, is_nullable = 0, size = 10 }, varnames, { data_type = VARCHAR, default_value = , is_nullable = 0, size = 64 }, ); __PACKAGE__-set_primary_key(id); # Created by DBIx::Class::Schema::Loader v0.04004 @ 2008-02-12 17:08:38 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:gkSc31rRGpYHxL8tAAd/kw # You can replace this text with custom content, and it will be preserved on regeneration 1; As I understand I have to add to above: __PACKAGE__-source_name('SomeName'); __PACKAGE__-resultset_class('Components::ResultSet'); LogParser::Schema::LogParserDB::Components;ame and create a new package with: package LogParser::Schema::LogParserDB::Components::ResultSet; load_classes() is trying to use this as a result class. Either move it or switch to load_namespaces. Note also there's a dbix-class list and I don't see a single bit of Catalyst code in your post, so I'd suggest you'd be better posting there. -- Matt S Trout Need help with your Catalyst or DBIx::Class project? Technical Directorhttp://www.shadowcat.co.uk/catalyst/ Shadowcat Systems Ltd. Want a managed development or deployment platform? http://chainsawblues.vox.com/http://www.shadowcat.co.uk/servers/ ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/
RE: [Catalyst] Doing work inside the DBIx::Class model
He meant result_source: http://cpan.uwinnipeg.ca/htdocs/DBIx-Class/DBIx/Class/ResultSet.html#result_source But this is not all and it is something that begs for a FAQ entry - I always forget how to do it. The important thing is how to add new methods to the ResultSet: package ArchivedBooks; use base qw/DBIx::Class/; __PACKAGE__-table('books_archive'); __PACKAGE__-source_name('Books'); __PACKAGE__-resultset_class('ArchivedBooks::ResultSet'); package ArchivedBooks::ResultSet; use strict; use warnings; use base qw( DBIx::Class::ResultSet ); sub advanced_search { my ( $self, $params, $attrs ) = @_; $self now is a ResultSet - so you can use methods on it. .. I have a similar problem want - to add some custom methods to the model. I've read your references but still - I can't get this thing to work. I have generated the model using Catalyst and get the following layout: LogParser.pm LogParser | |Components.pm |Connectinfo.pm |Logtype.pm and if I take a look into Components it looks like: package LogParser::Schema::LogParserDB::Components; use strict; use warnings; use base 'DBIx::Class'; __PACKAGE__-load_components(Core); __PACKAGE__-table(components); __PACKAGE__-add_columns( id, { data_type = INT, default_value = undef, is_nullable = 0, size = 11 }, component, { data_type = VARCHAR, default_value = , is_nullable = 0, size = 32 }, regex, { data_type = TEXT, default_value = , is_nullable = 0, size = 65535 }, nvars, { data_type = INT, default_value = 1, is_nullable = 0, size = 10 }, varnames, { data_type = VARCHAR, default_value = , is_nullable = 0, size = 64 }, ); __PACKAGE__-set_primary_key(id); # Created by DBIx::Class::Schema::Loader v0.04004 @ 2008-02-12 17:08:38 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:gkSc31rRGpYHxL8tAAd/kw # You can replace this text with custom content, and it will be preserved on regeneration 1; As I understand I have to add to above: __PACKAGE__-source_name('SomeName'); __PACKAGE__-resultset_class('Components::ResultSet'); LogParser::Schema::LogParserDB::Components;ame and create a new package with: package LogParser::Schema::LogParserDB::Components::ResultSet; use strict; use warnings; use base qw( DBIx::Class::ResultSet ); sub advanced_search { my ( $self, $params, $attrs ) = @_; } 1; So I created Components/ResultSet.pm with this content. But it fails with : Couldn't instantiate component LogParser::Model::LogParserDB, Cannot load schema class 'LogParser::Schema::LogParserDB': Can't locate object method source_name via package LogParser::Schema::LogParserDB::Components::ResultSet at /usr/lib/perl5/site_perl/5.8.5/DBIx/Class/Schema.pm line 301. I tried to remove the line: __PACKAGE__-source_name('SomeName'); but still same problem. As I read the docs the meaning of this is to use another name than the default name so why use it??? Regards Peter Sorensen/University of Southern Denmark/mail: [EMAIL PROTECTED] ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/
Re: [Catalyst] Doing work inside the DBIx::Class model
On Thu, Feb 21, 2008 at 9:17 AM, Peter Sørensen [EMAIL PROTECTED] wrote: He meant result_source: http://cpan.uwinnipeg.ca/htdocs/DBIx-Class/DBIx/Class/ResultSet.html#result_source But this is not all and it is something that begs for a FAQ entry - I always forget how to do it. The important thing is how to add new methods to the ResultSet: package ArchivedBooks; use base qw/DBIx::Class/; __PACKAGE__-table('books_archive'); __PACKAGE__-source_name('Books'); __PACKAGE__-resultset_class('ArchivedBooks::ResultSet'); package ArchivedBooks::ResultSet; use strict; use warnings; use base qw( DBIx::Class::ResultSet ); sub advanced_search { my ( $self, $params, $attrs ) = @_; $self now is a ResultSet - so you can use methods on it. .. I have a similar problem want - to add some custom methods to the model. I've read your references but still - I can't get this thing to work. I have generated the model using Catalyst and get the following layout: LogParser.pm LogParser | |Components.pm |Connectinfo.pm |Logtype.pm and if I take a look into Components it looks like: package LogParser::Schema::LogParserDB::Components; use strict; use warnings; use base 'DBIx::Class'; __PACKAGE__-load_components(Core); __PACKAGE__-table(components); __PACKAGE__-add_columns( id, { data_type = INT, default_value = undef, is_nullable = 0, size = 11 }, component, { data_type = VARCHAR, default_value = , is_nullable = 0, size = 32 }, regex, { data_type = TEXT, default_value = , is_nullable = 0, size = 65535 }, nvars, { data_type = INT, default_value = 1, is_nullable = 0, size = 10 }, varnames, { data_type = VARCHAR, default_value = , is_nullable = 0, size = 64 }, ); __PACKAGE__-set_primary_key(id); # Created by DBIx::Class::Schema::Loader v0.04004 @ 2008-02-12 17:08:38 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:gkSc31rRGpYHxL8tAAd/kw # You can replace this text with custom content, and it will be preserved on regeneration 1; As I understand I have to add to above: __PACKAGE__-source_name('SomeName'); This looks like a mistake to me - I did not mention source_name anywhere - I don't know what this is for. __PACKAGE__-resultset_class('Components::ResultSet'); LogParser::Schema::LogParserDB::Components;ame And what is this? and create a new package with: I usually just add this package to the same file as the source package - in this case to Components.pm. package LogParser::Schema::LogParserDB::Components::ResultSet; use strict; use warnings; use base qw( DBIx::Class::ResultSet ); sub advanced_search { my ( $self, $params, $attrs ) = @_; } 1; So I created Components/ResultSet.pm with this content. But it fails with : Couldn't instantiate component LogParser::Model::LogParserDB, Cannot load schema class 'LogParser::Schema::LogParserDB': Can't locate object method source_name via package LogParser::Schema::LogParserDB::Components::ResultSet at /usr/lib/perl5/site_perl/5.8.5/DBIx/Class/Schema.pm line 301. I tried to remove the line: __PACKAGE__-source_name('SomeName'); but still same problem. As I read the docs the meaning of this is to use another name than the default name so why use it??? see above -- Zbigniew Lukasiak http://brudnopis.blogspot.com/ ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/
Re: [Catalyst] Doing work inside the DBIx::Class model
On Wed, Feb 20, 2008 at 4:33 PM, Zbigniew Lukasiak [EMAIL PROTECTED] wrote: He meant result_source: http://cpan.uwinnipeg.ca/htdocs/DBIx-Class/DBIx/Class/ResultSet.html#result_source Thanks Zbigniew and Toby, that's just what I needed to know. Is there a good way to call a class method and get a resultset to use? I'm using Widget::class_method($schema) to give it the schema from $self-result_source-schema. Is there a better way to do it? thanks Cian ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/
Re: [Catalyst] Doing work inside the DBIx::Class model
On Wed, Feb 20, 2008 at 01:10:12PM +1000, Cian Barclay wrote: Hello Catalysters, I'm using Catalyst with a DBIx::Class model generated by DBIx::Class::Schema::Loader. I want to make my model do more work, rather than having my controllers fiddling around with model objects doing things to them. But I'm stuck on the bit where I want to get a resultset inside the model's subroutines. In a controller I use $c-model(Foo::Bar) to get the resultset. How can I get a resultset when I'm in the model? I could pass $c in to the model, but then the model wouldn't be usable without Catalyst. I'd like to be able to use the model for other things, but from reading the DBIx::Class manual, it seems like I'd need the $schema object to get resultsets. Since I'm stuck, I thought it would be a good time to ask for some help on this please. Is there a way to make a DBIx::Class model which is usable both for Catalyst and something else? How do you get resultsets inside the model which could either be from the Catalyst model, or from the database connection if Catalyst wasn't being used? I think you're looking for the $self-resultsource-schema method, inside your Model? tjc. ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/
Re: [Catalyst] Doing work inside the DBIx::Class model
On Feb 20, 2008 1:18 PM, Toby Corkindale [EMAIL PROTECTED] wrote: On Wed, Feb 20, 2008 at 01:10:12PM +1000, Cian Barclay wrote: which is usable both for Catalyst and something else? How do you get resultsets inside the model which could either be from the Catalyst model, or from the database connection if Catalyst wasn't being used? I think you're looking for the $self-resultsource-schema method, inside your Model? I don't have one of those, do you mean $self-_source_handle-schema? Is it okay to use with the leading underscore? ___ List: Catalyst@lists.scsys.co.uk Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/ Dev site: http://dev.catalyst.perl.org/