will_paginate pomocy

Witam wszystkich. Zacząłem przygodę z ror i potrzebuję pierwszej pomocy.

Problem 1.
Chyba jest jakiś błąd w will_paginate albo w ActiveRecord bo jak użyję /strona/2 to idzie takie zapytanie do bazy SQLite:

SELECT COUNT(*) FROM photos WHERE photos.gallery_id = X LIMIT 15 OFFSET 15

To zapytanie jest bez sensu i pewnie dla tego dla stron > 1 nic się nie wyświetla.

Problem 2.
Will nie budował mi takich urli jak bym chciał - to rozwiązałem przez CustomLinkRenderer. Czy da się to zrobić prościej?

Poniżej kodzik.

[code=ruby]# routes.rb
match ‘galeria’ => ‘galleries#showtime’, :via => :get
match ‘galeria/:url’ => ‘galleries#showtime’, :via => :get
match ‘galeria/:url/strona/:page’ => ‘galleries#showtime’, :via => :get

galleries_controller.rb

def showtime
@gallery_photos = @gallery.photos_ordered(params[:page])
end

models/gallery.rb

def photos_ordered page
WillPaginate::ViewHelpers.pagination_options[:renderer] = ‘CustomLinkRenderer’
Photo.where(:gallery_id => self).order(:ord).paginate(:per_page => 15, :page => page)
end

showtime.erb

will_paginate @gallery_photos

custom_link_renderer.rb

class CustomLinkRenderer < WillPaginate::ViewHelpers::LinkRenderer
def link(text, target, attributes = {})
if target.is_a? Fixnum
attributes[:rel] = rel_value(target)
target = url(target)
end

matched_gallery = target.match(/url=(.*)$/)
gallery = matched_gallery[1] unless matched_gallery.nil?

matched_page = target.match(/page=(.*)&/)
page = matched_page[1] unless matched_page.nil?

attributes[:href] = "#{gallery}/strona/#{page}"
tag(:a, text, attributes)

end
end[/code]

[quote=huba]Problem 1.
Chyba jest jakiś błąd w will_paginate albo w ActiveRecord bo jak użyję /strona/2 to idzie takie zapytanie do bazy SQLite:

SELECT COUNT(*) FROM photos WHERE photos.gallery_id = X LIMIT 15 OFFSET 15

To zapytanie jest bez sensu i pewnie dla tego dla stron > 1 nic się nie wyświetla.[/quote]
Zaraz, co jest w nim bez sensu? Zakładając X wyników na stronie (u Ciebie X=15), strona pierwsza to LIMIT X OFFSET 0, strona druga to LIMIT X OFFSET X. Strona trzecia to LIMIT X OFFSET 2X itd.

Nie rozumiem czemu budujesz urle ręcznie. Co Ci się nie spodobało w tych will_paginate’owych? Że page był doklejonym parametrem, tzn.
galeria/cośtam?page=2
?

Dla COUNT(*) zawsze zwraca tylko jeden wiersz, więc po co OFFSET? Coś nie tak…

Dokładnie, zależy mi na galeria/grupa_zdjęć/strona/2 zamiast galeria?page=2&url=grupa_zdjęć bo tak budował.

Stawiam dobry sok za pomoc z tym :wink:

COUNT nie zwraca żadnego wiersza tylko liczbę rekordów :wink:

W ogóle to nie powinieneś zdjęć pobierać przez Photo.where(…) tylko utworzyć relację

[code=ruby]class Gallery < ActiveRecord::Base
has_many :photos
end

class Photo < ActiveRecord::Base
belongs_to :gallery
end[/code]
i wtedy

def photos_ordered(page=1) WillPaginate::ViewHelpers.pagination_options[:renderer] = 'CustomLinkRenderer' photos.order(:ord).paginate(:per_page => 15, :page => page) end
Ja bym na twoim miejscu zrezygnował narazie z własnego renderera. Spróbuj uruchomić na początku normalnie i jak będzie działać wtedy dodawać bajery :wink:

btw. skąd (i jak) pobierasz :ord? Możesz też wywalić order i dodać default_scope w Photo

@zlw: relacje są, poprawię photos_ordered, z default_scope też skorzystam. :ord to kolumna z kolejnością w bazie.

Natomiast wciąż oba Problemy pozostają bez odpowiedzi…

  1. używasz najnowszego will_paginate? jakiej wersji rails używasz?
  2. spróbuj narazie wywalić CustomLinkRenderer
  3. pokaż jakiś większy kawałek kodu (szczególnie modele, ale nie tylko)

[quote=zlw]1. używasz najnowszego will_paginate? jakiej wersji rails używasz?
2. spróbuj narazie wywalić CustomLinkRenderer
3. pokaż jakiś większy kawałek kodu (szczególnie modele, ale nie tylko)[/quote]
Wielkie dzięki Krzysiek za podpowiedź nr 1. gem update sqlite pomógł. Miałem 1.3.3 w 1.3.4 Problem 1 nie występuje.
Jeśli chodzi o Problem 2 to nie CustomRenderer nie jest tragiczny więc zostawiam to i prę dalej :slight_smile:

Super Społeczność!!