2015-03-11 4 views
1

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

Окончательная структура данных я получить с помощью ResultClass::HashRefInflator после некоторых преобразований выглядит следующим образом:

my $data = $self->db->resultset('Category')->with_translation($lang)->with_categories->with_products->display_flattened; 

[ 
    [0] { 
     parent_name  "Parent Category", 
     id    3, 
     name   "First Child category", 
     parent_id  1, 
     position  1, 
     products  [ 
      [0] { 
       name   "Product One", 
      }, 
      ... 
     ], 
    } 
    ... 
] 

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

Например, если я хочу 20 элементов на экран (элемент может быть категорией или продуктом), и я применяю -> страницу (1) на Схеме :: ResultSet :: Категория, она будет содержать 20 категорий со всеми продуктами в них вместо 1 категории с 19 связанными продуктами и так далее.

Единственный вариант, который приходит мне на ум в настоящий момент, заключается в хранении всей структуры данных в виде одномерного массива в каком-то хранилище в памяти, таком как Redis или memcached, и нарезать его по назначению, но я знаю, что это неправильно.

ответ

0

Пробовали ли вы:

my $data = $self->db->resultset('Category')->with_translation($lang)->with_categories->with_products->search_rs(undef, { page => 1 })->display_flattened; 
+0

Да, я пробовал это, но это ограничивает количество строк категории. Кстати, вот что такое Schema :: ResultSet :: Category-> with_products выглядит так: 'sub with_products { my ($ self, $ lang) = @_; $ self-> Поиск ( { 'product_i18ns.language_code' => $ Ланг, }, { предвыборки => { 'продукты' => '' product_i18ns }, order_by => {-asc => 'products.art_no'}, }, ); } ' – romel

1

Я не совсем знаю, что вы хотите здесь, потому что это звучит, как вы хотите категории считать как часть пагинации; кажется странным выбором для меня. Если вы можете избежать подсчета категории, то лучшим вариантом может быть вместо получение первой страницы категорий, получение первой страницы Продуктов и их связанных категорий. Таким образом, у вас есть связанный набор данных вместо возможного взрыва, указанного выше.

Вам нужно будет внести некоторые изменения (по крайней мере, с добавлением методов) в ваши реквизиты, , но это не должно быть слишком сложно. Вот то, что вы могли бы сделать вместо:

my $data = $self->db->resultset('Product') 
    ->with_translation($lang) 
    ->with_categories 
    ->with_products 
    ->search(undef, { page => 1 }) 
    ->display_flattened; 

Поэтому, учитывая это, вы получите страницу продуктов (я думаю, что это 25), а затем их связанные категории.

В качестве примечания стороны, это немного странно, что вы делаете with_categories по категории resultset. Возможно, я ошибаюсь, но, по крайней мере, это то, что нужно делать.