Перемещение will_paginate к модели - PullRequest
0 голосов
/ 18 мая 2011

На моей модели Вопроса у меня есть несколько областей действия

scope :recent, order("created_at DESC")  
scope :approved, where("status = ?", "approved")       
scope :answered, approved.recent.where("answers_count > ?", 0)

На моем контроллере вопросов я получаю вопросы, используя области действия

пример 1:

@questions = Question.approved.recent

пример 2:

@questions = User.find(session[:user_id]).topics.map { |t| t.questions.approved.recent }.flatten.uniq

Я пытаюсь поместить will_paginate в мою модель, чтобы упростить работу контроллера, но 2-й пример очень сложен, так как использует отображение для получения вопросов в соответствии с предпочтениями.

Я пытался добавить это на моей модели

  def self.pagination(page = 1)
      self.paginate(:page => page, :per_page => 5)
    end

и затем на моем контроллере у меня есть

@questions = Question.approved.recent.pagination.(params[:page])

Это хорошо работает для 1-го примера, но я не знаю, как реализовать это на 2-м примере

Есть подсказки?

1 Ответ

3 голосов
/ 23 мая 2011

Это похоже на Rails 3. Обязательно используйте ~> 3.0.pre2 версию гема will_paginate.

Вы можете использовать метод paginate в конце своей цепочки областей. Например, ваш «пример 1» будет:

@questions = Question.approved.recent.paginate(:page => params[:page], :per_page => 20)

Я вижу, что вы создали собственный метод (pagination), чтобы обернуть этот шаблон, но лучше пока вы сохраняете этот синтаксис в исходном виде, особенно если вы имеете дело с областями видимости и объектами Relation в Rails 3 и will_paginate пока что не имеет должной поддержки (но это будет).

В вашем "примере 2" кажется, что вам нужно получить только первые несколько последних вопросов по каждой теме, и вы не будете выполнять здесь полноценную нумерацию страниц (например, переходите на страницу 2 и далее). Вам не нужно использовать метод paginate здесь; Вы можете просто использовать ActiveRecord limit:

current_user = User.find(session[:user_id])
@questions = current_user.topics.map { |topic|
  topic.questions.approved.recent.limit(5).to_a
}.flatten.uniq
...