2008-11-07 4 views
5

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

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

Читая документы не дает мне ни малейшего понятия, как осуществить стратегию, как это.

ответ

8

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

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

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

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

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

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

+0

У нас есть код, который использует результаты. Если мы отфильтровываем результаты вручную, то код, ожидающий результатов, должен быть радикально изменен. Это предлагаемое «фильтрующее» решение является результатом большой работы над нашей командой, ищущей альтернативы, но причины слишком обширны, чтобы ответить здесь. – Ovid 2008-11-07 10:07:11

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^