Как я могу разбить на две таблицы, используя Sequel :: Model? - PullRequest
3 голосов
/ 30 октября 2011

Для разнообразия вместо приложения Rails я использую приложение на основе Ramaze и, следовательно, Sequel.

У меня есть модель Tag, которая связана со многими со многими :posts через таблицу соединений :taggings, а с :external_posts через таблицу соединений :external_post_taggings.

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

Без нумерации страниц я бы сделал:

@combined = (@tag.posts + @tag.external_posts).sort_by(&:created_at).reverse

Однако мне нужно использовать нумерацию страниц. Если бы это было просто .posts я бы сделал:

@posts = @tag.posts.paginate(page, 10)

но я не знаю, как разбить на две таблицы, если это вообще возможно.

1 Ответ

4 голосов
/ 01 ноября 2011

Предполагая, что вы хотите разбить на страницы комбинацию тегов и сообщений, вы, вероятно, захотите разбить на пары объединение двух наборов данных ассоциации:

@tag.posts_dataset.
  union(@tag.external_posts_dataset).
  order(:created_at.desc).
  paginate(page, 10)

Однако, это имеет проблемы, если posts и external_posts не используют один и тот же класс модели. Если они используют отдельные классы моделей, вам, возможно, придется отслеживать смещения вручную для каждого. Как правило, для каждой страницы выберите следующие 10 записей для обеих ассоциаций (начиная с каждого смещения). Объедините 2 группы по 10 в массив, отсортируйте его по перевернутому полю созданного_ката и возьмите первые 10 результатов. Подсчитайте количество постов и внешних постов в этом массиве из 10 комбинированных / отсортированных записей и обновите смещения постов и внешних постов соответственно для использования на следующей странице.

Например, на странице 1 вы будете использовать смещение 0 для обоих. Если после объединения, сортировки и взятия первых 10 в массиве из 10 будет 7 постов и 3 внешних поста, на странице 2 смещение постов будет начинаться с 7, а смещение внешних постов - с 3.

...