Вы можете использовать Array#from
для имитации пагинацию, но реальная проблема в том, что вы не должны использовать Array
вообще.
Это то, что предназначено для. Вы должны внимательно прочитать это руководство, есть много полезных вещей, которые вам понадобятся, если вы разрабатываете приложения Rails.
Позвольте мне показать вам лучший способ сделать то же самое:
class Profile < ActiveRecord::Base
has_many :opinion_ratings
has_many :opinions, :through => :opinion_ratings
end
class Opinion < ActiveRecord::Base
has_many :opinion_ratings
end
class OpinionRating < ActiveRecord::Base
belongs_to :opinion
belongs_to :profile
end
Очень важно, чтобы ваша схема базы данных следующие соответствующие соглашения об именах или все это сломается. Убедитесь, что вы создаете свои таблицы с помощью Database Migrations вместо того, чтобы делать это вручную.
Эти ассоциации создадут помощников на ваших моделях, чтобы сделать поиск намного проще. Вместо того, чтобы повторять список OpinionRatings и собирать пользователей вручную, вы можете сделать Rails сделать это для вас с использованием named_scope
или scope
в зависимости от того, используете ли вы Rails 2.3 или 3.0. Поскольку вы не указали, я приведу оба примера. Добавьте это к классу OpinionRating:
2,3
named_scope :for, lambda {|id|
{
:joins => :opinion,
:conditions => {
:opinion => { :id => id }
}
}
}
named_scope :agreed, :conditions => { :agree => true }
named_scope :with_profiles, :includes => :profile
3,0
scope :agreed, where(:agree => true)
def self.for(id)
joins(:opinion).where(:opinion => { :id => id })
end
В любом случае вы можете позвонить for(id)
на OpinionRatings
модели и передать его идентификатор:
2.3
@ratings = OpinionRating.agreed.for(params[:id]).with_profiles
@profiles = @ratings.collect(&:profile)
3,0
@ratings = OpinionRating.agreed.for(params[:id]).includes(:profile)
@profiles = @ratings.collect(&:profile)
Результатом всего этого является то, что теперь вы можете легко постраничной:
@ratings = @ratings.paginate(:page => params[:page])
Обновление для Rails 4.х: более или менее то же самое:
scope :agreed, ->{ where agreed: true }
def self.for(id)
joins(:opinion).where(opinion: { id: id })
end
Хотя для нового Rails моего предпочтение kaminari для пагинации:
@ratings = @ratings.page(params[:page])
Приехав сюда из поиска Google для «массива paginate rails», я хотел поделиться с другими посетителями, что [kaminari] (https://github.com/amatsuda/kaminari) является альтернативой pagination рельсов, , Эффективно обрабатывает массивы. – 2015-01-28 17:50:12