[Dbix-class] Adding a method to ResultSet?
Matija Grabnar
matija at serverflow.com
Wed Jan 9 13:54:02 GMT 2008
(I also asked this at http://perlmonks.org/?node_id=661319 )
Here is what I'm trying to do:
package ThreadedDB::Article; use strict; use warnings; use base
'DBIx::Class'; __PACKAGE__->load_components("Core");
__PACKAGE__->table("article"); __PACKAGE__->add_columns( "id", {
data_type => "INT", default_value => undef, is_nullable => 0, size => 11
}, # etc, etc, etc ); __PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many( "article_texts", "ThreadedDB::ArticleText", {
"foreign.article" => "self.id" }, ); # Created by
DBIx::Class::Schema::Loader v0.04004 @ 2008-01-03 18:12:12 # DO NOT
MODIFY THIS OR ANYTHING ABOVE! md5sum:Y0WFrRSlgOqaz/fbhRt98A package
ThreadedDB::Article::ResultSet; use base 'DBIx::Class::ResultSet'; sub
insert_article { my ($self, $topic, $parent, $msgtext) = @_; my
$articles = $self->resultset('Article'); eval { $self->txn_do (sub { # a
complex operation that is not relevant yet }) }; }
In other words, I'd like to find a way to put a method into the
Article.pm file in such a way that I could access it by doing
$schema->resultset('Article')->insert_article(...)
I've tried directly declaring the class (as commented out, above) but it
didn't work. Either I'm misunderstanding what the resulting class should
be called, or I'm misunderstanding something else.
I did read Re^2: [DBIX::Class] problem with Arbitrary SQL through a
custom ResultSource <http://perlmonks.org/?node_id=658193>, but it
didn't help since the method I need contains a bunch of code (not all of
which can be in SQL), and all of which should be done inside a transaction.
my $articles = $schema->resultset('ThreadedDB::Article');
DB<3> x $articles->can('create')
0 CODE(0x88b1cd4)
-> &DBIx::Class::ResultSet::create in /usr/share/perl5/DBIx/Class/ResultSet.pm:1625-1630
Looks like I'm looking at the right class...
DB<4> x $articles->can('insert_article')
0 undef
But it doesn't know how to "insert_article".
I tried looking at the return from $schema->resultset to see if that would give me a clue as
to which class I should add methods to, but that gave me:
DB<5> x ref $schema->resultset('ThreadedDB::Article')
0 'DBIx::Class::ResultSet'
And I don't think I should be adding my methods to that.
I also tried doing it without the extra "package" declaration (in the
hope that it would somehow automagically do the right thing, but that
didn't work, either.
I'd be grateful for any pointers...
More information about the DBIx-Class
mailing list