Lowgain, to nie brzmi jak ty, ale po prostu, aby się upewnić - tak naprawdę nie robisz testów z named_scope o nazwie zakres prawda? Ponieważ zakres jest istniejącą metodą i używanie jej jako nazwy zasięgu powoduje błąd (i nieskończoną pętlę).
EDIT:
Czy Twój named_scope zdarzyć obejmują: klauzuli LIMIT? Właśnie zacząłem mieć podobny problem. Mam odpowiedź modelu który belongs_to Użytkownika, o nazwie zakres coś takiego:
named_scope :top, lambda { |limit| {
:limit => limit,
:order => 'total_score DESC' }}
A ja widząc wyniki w konsoli, takie jak to:
?> u = User.find 1
?> u.responses.length
=> 9
?> u.responses.paginate(:page => 1, :per_page => 5).length
=> 5
?> u.responses.top(3).length
=> 3
?> u.responses.top(3).paginate(:page => 1, :per_page => 5).length
=> 5
to! W jaki sposób moje 3 strony mogą się paginować, aby wytworzyć więcej niż 3 wiersze?Na swoim przykładzie starałem swoją find (: all) Sztuczka z podobnych wyników:
?> u.responses.top(3).find(:all).paginate(:page => 1, :per_page => 5).length
=> 3
To wygląda na błąd w named_scope, bo mogę wziąć will_paginate z obrazu i uzyskać podobny chaos występuje:
?> u.responses.top(3).length
=> 3
?> u.responses.top(3).size
=> 9 <-- .size produces wrong answer
?> r = u.responses.top(3)
?> r.size
=> 3 <-- correct when result assigned to var
Do tej pory wydaje się, że dzieje się tak tylko wtedy, gdy używam MySQL. Myślę, że przeczytałem inny post na StackOverflow, w którym ktoś miał podobny problem z użyciem rozmiaru .size z wynikami AR i MySQL, a rozwiązaniem było zawsze użycie .length na swoich wynikach AR. Próbowałem modyfikować will_paginate, aby zastąpić wszystkie wystąpienia. Rozmiar z. Length, ale niestety nie było to takie proste, ale podejrzewam, że ten lub podobny problem w jakiś sposób wpływa na will_paginate.
Na razie używam twojej sztuczki find (: all) do zhakowania wokół tego.
Hmm, to jest interesujące! Czy istnieje jakaś zauważalna wadliwość działania, ponieważ robi to w paginacji każdej własności? – Lowgain
W jaki sposób można go paginować każdą nieruchomość? :) Nie każdy, ale wszystko. Nazwany zakres * all_properties * jest rodzajem metody klasy (nie instancji!). Tak więc, gdy wywołujemy * self.all_properties *, otrzymujemy wszystkie właściwości z tego nazwanego zakresu. Potem je paginujemy. Własność oznacza klasę Właściwość samą w sobie - nie przedmiot klasy Właściwość. – Voldy