#ruby #pagination #sequel
#ruby #разбивка на страницы #продолжение
Вопрос:
Для разнообразия я использую приложение на основе Ramaze и, следовательно, Sequel вместо приложения Rails.
У меня есть модель Tag
, с которой многие ко многим связаны :posts
через таблицу соединений :taggings
и :external_posts
через таблицу соединений :external_post_taggings
.
Я хочу собрать обе эти ассоциации вместе и упорядочить их по полю даты, которое вызывается created_at
в каждой таблице.
Без разбивки на страницы я бы сделал:
@combined = (@tag.posts @tag.external_posts).sort_by(amp;:created_at).reverse
Однако мне нужно использовать разбивку на страницы. Если бы это было просто .posts, я бы сделал:
@posts = @tag.posts.paginate(page, 10)
но я не знаю, как разбить страницы на две таблицы, если это вообще возможно.
Ответ №1:
Предполагая, что вы хотите разбить на страницы комбинацию тегов и записей, вы, вероятно, захотите разбить на страницы объединение двух наборов данных ассоциации:
@tag.posts_dataset.
union(@tag.external_posts_dataset).
order(:created_at.desc).
paginate(page, 10)
Однако это вызывает проблемы, если posts и external_posts не используют один и тот же класс модели. Если они используют отдельные классы моделей, вам, возможно, придется отслеживать смещения вручную для каждого. По сути, для каждой страницы выберите следующие 10 записей для обеих ассоциаций (начиная каждую с соответствующего смещения). Объедините 2 группы по 10 в массив, отсортируйте его по обратному полю created_at, возьмите первые 10 результатов. Подсчитайте количество записей и внешних записей в этом массиве из 10 объединенных / отсортированных записей и соответствующим образом обновите смещения записей и внешних записей для использования на следующей странице.
Например, на странице 1 вы бы использовали смещение 0 для обеих. Если после объединения, сортировки и взятия первых 10 записей в массиве из 10 будет 7 записей и 3 внешних записи, на странице 2 вы начнете смещение записей на 7, а смещение внешних записей на 3.
Комментарии:
1. Да, это два разных класса моделей. поэтому мне пришлось бы переходить по страницам по одной, отслеживая смещения, пока я не добрался до нужной страницы? блин, звучит сложно 🙂 Я думаю, что вы правы.