Как я могу отфильтровать наборы результатов DBIX :: Class с внешними данными? - PullRequest
6 голосов
/ 07 ноября 2008

Использование DBIx :: Class , и у меня есть набор результатов, который необходимо отфильтровать по данным, которые не могут быть сгенерированы SQL. Что мне нужно сделать, это что-то, что по сути эквивалентно этому гипотетическому примеру:

my $resultset     = $schema->resultset('Service')->search(\%search);
my $new_resultset = $resultset->filter( sub {
    my $web_service = shift;
    return $web_service->is_available;
} );

Прочитав документы, я не понимаю, как выполнить такую ​​стратегию.

Ответы [ 2 ]

8 голосов
/ 07 ноября 2008

Вы не можете на самом деле из-за целей, для которых предназначены наборы результатов DBIC:

  • Они компилируются в SQL и запускают один запрос, что они делают не раньше, чем когда вы запрашиваете результаты.
  • Они составные.

Разрешение фильтрации по коду, выполняемому на стороне Perl, сделает эти свойства чрезвычайно сложным и скрывает тот факт, что такие наборы результатов фактически выполняют N запросов при составлении.

Почему ты этого хочешь? Почему просто получить результаты и отфильтровать их самостоятельно недостаточно?

  • Инкапсуляция ? (Например, скрытие логики фильтрации на уровне бизнес-логики, но запуск запроса на уровне логики отображения.) Затем напишите пользовательский подкласс ResultSet, который имеет метод доступа, который выполняет запрос и выполняет желаемую фильтрацию.

  • Накладные ? (Например, вы отклоните большинство результатов, поэтому вам не понадобятся дополнительные затраты на создание объектов для них.) Затем используйте HashRefInflator.

0 голосов
/ 28 февраля 2011

Если вы отфильтруете результаты и получите список строк, вы можете создать новый набор результатов, подобный этому: http://search.cpan.org/~abraxxa/DBIx-Class-0.08127/lib/DBIx/Class/Manual/Cookbook.pod#Creating_a_result_set_from_a_set_of_rows.

Это может обеспечить согласованность результатов при сохранении результатов в качестве набора результатов, но я думаю, что вы не сможете связать его или использовать другие методы набора результатов для него.

...