Как разбить записи на несколько моделей?(мне нужно полиморфное соединение?) - PullRequest
7 голосов
/ 31 октября 2011

После долгих поисков я все еще немного растерялся.Есть еще несколько подобных вопросов, которые касаются разбиения на страницы на нескольких моделях, но они либо остаются без ответа, либо они разбивают на страницы по каждой модели отдельно.

Мне нужно разбить на страницы все записи учетной записи сразу.

class Account
  :has_many :emails
  :has_many :tasks
  :has_many :notes
end

Итак, я хотел бы найти 30 самых последних «вещей», независимо от того, что они есть.Возможно ли это даже с текущими решениями по нумерации страниц?

Как, например, использовать какую-то комбинацию энергичной загрузки и Kaminari или will_paginate?


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

И если это так, я не совсем уверен, как должен выглядеть этот код.Есть предложения?


Какой путь лучше?(или даже возможно)

Rails 3.1, Ruby 1.9.2, приложение не запущено.

Ответы [ 3 ]

2 голосов
/ 11 марта 2013

с will_paginate:

@records = #do your work and fetch array of records you want to paginate ( various types )

затем выполните следующее:

current_page = params[:page] || 1
per_page = 10
@records = WillPaginate::Collection.create(current_page, per_page, records.size) do   |pager|
pager.replace(@records)
end

тогда по вашему мнению:

<%=will_paginate @records%>
1 голос
/ 03 ноября 2011

Хороший вопрос ... Я не уверен в "хорошем" решении, но вы могли бы сделать хакерское решение в ruby:

Вам нужно будет сначала получить 30 последних из каждого типа "вещи", и поместить их в массив, проиндексированный с помощью create_at, затем отсортировать этот массив по созданному_каталогу и взять верхний 30.

Полностью нерефакторированный старт может выглядеть примерно так:

emails = Account.emails.all(:limit => 30, :order => :created_at)
tasks = Account.tasks.all(:limit => 30, :order => :created_at)
notes = Account.notes.all(:limit => 30, :order => :created_at)
thing_array = (emails + tasks + notes).map {|thing| [thing.created_at, thing] }
# sort by the first item of each array (== the date)
thing_array_sorted = thing_array.sort_by {|a,b| a[0] <=> b[0] }
# then just grab the top thirty
things_to_show = thing_array_sorted.slice(0,30)

Примечание: не проверено, может быть полно ошибок ...;)

0 голосов
/ 16 октября 2015
emails = account.emails
tasks = account.tasks
notes = account.notes

@records = [emails + tasks + notes].flatten.sort_by(&:updated_at).reverse

@records = WillPaginate::Collection.create(params[:page] || 1, 30, @records.size) do |pager|
  pager.replace(@records)
end

Вот так ...:)

...