Могу ли я иметь отношения "Родитель has_many GrandChildren через детей" в DBIx :: Class? - PullRequest
2 голосов
/ 13 марта 2009

Я хотел бы иметь такую ​​функциональность:

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

Я могу сделать это легко вне родительского класса с помощью простого цепного соединения:

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

Но внутри родительского класса у меня нет доступа (и не должен) к объекту схемы. Внутри родительского класса я могу получить доступ к $self->children, но он возвращает набор результатов для детей, и мне придется перебирать их, чтобы получить grandchildren.

каждого

Есть ли способ определить этот стиль ActiveRecord?

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

1 Ответ

1 голос
/ 13 марта 2009

Я получил большую помощь от #dbix-class. Возможно, не существует способа явно определить отношение :through в стиле ActiveRecord, но есть способ получить дочерние элементы дальше по цепочке результатов.

Используя ResultSet search_related метод, вы можете установить отношения и использовать дочерние методы доступа. Например, в моем родительском классе:

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

    return \@gchildren;
}

Так как search_related возвращает набор результатов, я думаю, вы могли бы связать эти search_related вызовы так далеко, как хотите.

...