Вы можете использовать функцию рельсов для наследования одной таблицы (STI). Это позволяет хранить аналогичные модели в одной таблице, поэтому вы можете хранить обычные и извлеченные задания в одной таблице. Выбор и разбиение на страницы теперь будут очень простыми и устранят все потребности в любой пользовательской логике в ruby. Это также может значительно повысить производительность (в зависимости от количества записей в базе данных).
См. Официальные документы: http://guides.rubyonrails.org/association_basics.html#single-table-inheritance
Итак, вы бы создали родительский класс:
class Job < ActiveRecord::Base
scope :published, -> { where(published: true) } # is inherited by all children
scope :latest, -> { order(published_at: :desc) } # shortcut for ordering
# you can add more scopes to enhance readability in controller
# Job related logic inherited by all children
end
Важно, чтобы в таблице для этого AR был столбец type
(строка).
Затем вы выводите оба типа заданий из этого родительского класса:
class InternalJob < Job
# InternalJob related logic
end
class FetchedJob < Job
# FetchedJob related logic
end
Теперь вы можете получить все задания по желанию вашего сердца и разбить их на страницы:
InternalJob.published # returns all published internal Jobs
FetchedJob.published # returns all published internal Jobs
Job.published # returns all Jobs
разбиение на страницы и сортировка просты:
Job.published.sort_by(&:published_at).reverse.paginate(:page => params[:page], :per_page => 10)
Это очень хорошо масштабируется, поскольку база данных выполняет всю фильтрацию и сортировку.
Это также делает ваш код контроллера очень тонким:
def index
@published_jobs = Job.published.latest.paginate(:page => params[:page], :per_page => 10).group_by do |job|
job.published_at.to_date
end
end