Вы можете использовать Array#from
для имитации пагинации, но реальная проблема здесь в том, что вам вообще не следует использовать Array
.
Это то, что Ассоциации ActiveRecord предназначены для.Вы должны внимательно прочитать это руководство, есть много полезных вещей, которые вам необходимо знать, если вы разрабатываете приложения на 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
Важно, чтобы схема вашей базы данных выполняла надлежащие соглашения об именах, или все это сломается.Убедитесь, что вы создаете свои таблицы с помощью Миграция базы данных вместо того, чтобы делать это вручную.
Эти ассоциации создадут помощники в ваших моделях, чтобы упростить поиск.Вместо того, чтобы повторять список 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.x: более или менее то же самое:
scope :agreed, ->{ where agreed: true }
def self.for(id)
joins(:opinion).where(opinion: { id: id })
end
Хотя для более новых Rails я предпочитаю kaminari для нумерации страниц:
@ratings = @ratings.page(params[:page])