2010-12-12 10 views
6

Witam Mam problemy z will_paginate w szynach 3, mam to w moim constrollernie można przekonwertować na nil Array will_paginate

@posts = Post.paginate(:all, 
    :include => [:author, :categories], 
    :conditions=>"status = 'published'", 
    :order=>"blog_posts.created_at DESC", 
    :per_page => 1, :page => params[:page]) 

i <% = will_paginate @posts%> moim zdaniem, ale Otrzymuję ten błąd nie można przekształcić zero w Array stale.

Czy ktoś może mi pomóc?

góry dzięki

Odpowiedz

8

Spróbuj w ten sposób:

@posts = Post.includes(:author, :categories).where(:status => "published").order("blog_posts.created_at DESC").paginate(:per_page => 1, :page => params[:page]) 

To Rails 3 preferowany sposób.

+0

Iain DZIĘKUJEMY TAK DUŻO !!! To rozwiązało problem. – Michael

+0

Jeśli masz 1000 postów, to załaduje je wszystkie, połączy tablicę. Niezbyt wydajne. –

+2

Nie powinno; nadal jest zbiorem, więc powinien dodać zasięgi do zapytania, zanim zostanie wykonane. – iain

11

Musisz zainstalować will_paginate w wersji 3.0.pre2, aby dział stronicowania działał na poziomie bazy danych, a nie na tablicy.

gem 'will_paginate', '3.0.pre2' 
+0

Miałem ten problem dzisiaj i właśnie to musiałem zrobić! –

2

Iain już odpowiedział na to pytanie, ale chciałem tylko dodać jakieś dane kopii zapasowej jego oświadczenie, że to polecenie nie paginate całą kolekcję

irb(main):005:0> Benchmark.bm do |x| 
irb(main):006:1* x.report {Vote.all.paginate(:per_page => 10, :page => 1)} 
irb(main):007:1> x.report {Vote.order("created_at DESC").paginate(:per_page => 10, :page => 1)} 
irb(main):008:1> end 
     user  system  total  real 
210.490000 0.740000 211.230000 (214.754060) 
    0.000000 0.000000 0.000000 ( 0.429304) 

To był prowadzony na bazie danych z 500 000 wierszy w tabeli głosowania (postgres), Rails 3.0.5

Tak więc zgodziłbym się z nim, że zakresy są dodawane do zapytania przed wykonaniem.

Powiązane problemy