views:

173

answers:

1

I'd like to have functionality like this:

$parent->get_grandchildren_by_category({category => 'foo'});

I can do it easily outside of the parent class with a simple chained join:

$schema->resultset('Parent')->search(
 {
  'me.id' => 62,
  'grandchildren.category' => 'foo'
 },
 {
  join => {'children' => 'grandchildren'}
 }
);

But inside the parent class I don't have access (and shouldn't) to the schema object. Inside the parent class I can access $self->children but that returns a resultset of children, and I'd have to iterate over them to get each one's grandchildren.

Is there any way I can define this ActiveRecord style?

class Parent < ActiveRecord::Base
   has_many :children
  has_many :grandchildren, :through => :children
end
+1  A: 

I got a lot of help from #dbix-class. There may not be a way to explicitly define a :through relationship ActiveRecord-style, but there is a way to grab children further down the result chain.

Using the ResultSet's search_related method, you can reach through a relationship and use the child's accessors. For example, in my Parent class:

sub get_grandchildren_by_category{
    my ($self, $category) = @_;
    my @gchildren = $self->children->search_related('grandchildren'
        {
          'grandchildren.category' => $category
        }
    );

    return \@gchildren;
}

Since search_related returns a resultset, I guess you could chain those search_related calls as far as you want.

wes
I may be wrong here, but the '_rs' usually represents a resultset. @gchild_rs is actually a collection of row objects. To avoid confusion, either call it in scalar context or use search_related_rs instead of search_related.
gpojd