2013-08-13 14 views
13

W mojej aplikacji utworzyłem ostatnio funkcję wiadomości.Relacje 4 Relacja # wszystkie wycofanie

@recentposts = Post.all(:order => 'created_at DESC', :limit => 5) 

Ta zmienna sprawia pewne kłopoty. Kiedy uruchomić testy mam następujący błąd:

DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. Post.where(published: true).load). If you want to get an array of records from a relation, you can call #to_a (e.g. Post.where(published: true).to_a). (called from show at /home/mateusz/rails4/Bloggers/app/controllers/users_controller.rb:18)

byłem seraching rozwiązanie w Google, ale nie go znaleźć ...

Odpowiedz

18

Wystarczy napisać:

@recentposts = Post.order('created_at DESC').limit(5) 

to_a nie jest wyraźnie konieczne, ponieważ dane są leniwi załadowany, gdy są potrzebne.

+0

Podczas gdy ja jestem w leniwym załadunku, on był z prośbą o równoważną linię. Jeśli migruje kod, prawdopodobnie chce trzymać wszystko jak najbliżej tego, co było słuszne? – bluehallu

+0

Staram się myśleć o krok do przodu. Tak, jeśli identyczne jest to, co chce OP. Zanim nie było alternatywy, osobiście uważam, że lepiej załadować dane tylko wtedy, gdy są potrzebne. Na przykład. w ten sposób możesz jeszcze zawęzić wyniki i dodać zakresy, gdy zajdzie taka potrzeba. Może to spowodować bardzo czysty kod. – nathanvda

+0

Tak, już powiedziałem, że jestem zajęty leniwym ładowaniem, ale znowu, jeśli on próbuje migrować aplikację, utrzymanie wszystkiego tak blisko, jak to było, jest prawdopodobnie najlepszym pomysłem, chyba że wie wystarczająco dużo o aplikacji, aby to zmienić. – bluehallu

10

Wywołanie Post.all zwróci ActiveRecord::Relation, który zostanie załadowany leniwie domyślnie. Wywołanie Post.all.load zwróci niecierpliwie załadowane ActiveRecord::Relation. Na koniec wywołanie Post.all.to_a spowoduje zwrócenie wszystkich rekordów w tablicy.

W twoim przypadku to zrobić:

Post.order('created_at DESC').limit(5).to_a 

która zwraca tablicę z pierwszych 5 postach, posortowanych według created_at w kolejności malejącej.

+0

Nie jestem pewien, co proponujesz w drugiej linii, ale to w ogóle nie działa. – nathanvda

+0

Przepraszamy, dziękuję mliebelt za poprawienie błędu składni. – bluehallu

+4

Jeśli używam to_a bezpośrednio na klasie, pojawia się błąd: 'niezdefiniowana metoda' to_a 'dla # 'w Rails 4. – Douglas

2

Zagnieżdżony sposób

Post.order('created_at DESC').limit(5).to_a 
+0

Dziękuję wszystkim za pomoc :) –

+0

@ MateuszUrbański więc, jeśli już masz odpowiedź, daj trochę miłości i zaznacz wybraną odpowiedź jako poprawną –