[Dbix-class] question about adding custom methods to DBIx Classes
John Napiorkowski
jjn1056 at yahoo.com
Fri May 26 05:03:10 CEST 2006
Hi,
I'm sure I'm just missing something obvious, but I'm
having trouble adding some custom methods to a DBIx
class. I think I understand the issue but I was
hoping someone could help clarify for me, since I get
this to work sometime, but other times it doesnt.
So I have a DBIx class similar to this:
package myApp::Schema::members;
use warnings;
use strict;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/ PK::Auto Core /);
__PACKAGE__->table('members');
__PACKAGE__->add_columns(qw/ id name email /);
__PACKAGE__->set_primary_key(qw/ id /);
sub lc_name
{
my $self = shift @_;
return lc $self->email;
}
sub id_by_email
{
my $self = shift @_;
my $email = shift @_;
return $self->find({email=>$email})->id;
}
Now, assuming that my 'email' column is specified as
unique so I can do ->find on it I can see that the
first function workings properly when I do (in
catalyst)
my $lc_name = $c->model("db::members")->find([any
valid id])->lc_name;
but the second function dies with a "Can't locate
object method "id_by_email" via package
"DBIx::Class::ResultSet" when I try:
my $id = $c->model("db::members")->id_by_email([any
valid email]);
So I figured that when a function is called more like
a class method than an instance method I need to do
__PACKAGE__, rather than $self, which is how I usualy
handle class methods. So I changed the second funtion
to:
sub id_by_email
{
my $self = shift @_;
my $email = shift @_;
return __PACKAGE__->find({email=>$email})->id;
}
But (in catalyst) my error remains the same. So I am
wondering if this has something to do with how
catalyst does an inplicit ->resultset for you? Or I
am just not getting the way this works (probably the
case :) ).
I'd like to get this to work because I find myself
doing a lot of ...->find({[unique_col]=>$value})->id
and I'd like to clean it up a bit, particularly for
the tables that are just a list of standard constants,
like the gender table I have (if I have to do
$c->model('db::genders')->find({name=>'male'})->gender_id
one more time I will go crazy). So I am wondering if
anyone out there has run into a similar issue?
Sorry if this should be on the catalyst list, but I
didn't want to crosspost and this list seemed the
better choice.
--john
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
More information about the Dbix-class
mailing list