2017-11-14 1 views
1

Ich habe mit mir eine Reihe von Posts von einem Gerüst und Bilder hochgeladen mit Papierclip Juwel erstellt. Ich möchte auf jedem Profil des Benutzers die letzten sechs Bilder von den Benutzern letzten Beiträge zeigen, und dafür bin ich Filterung als solcheLimit Bilder zeigen in den letzten sechs Post

<% @posts.limit(6).each do |tweet| %> 
    <% if post.media.present? %> 
    <%= link_to image_tag(post.media.url(:thumb)), tweet %><br> 
    <% end %> 
<% end %> 

In meinem Controller habe ich die angeordnet Beiträge als solche

@posts = user.posts.order('created_at desc') 

Meine Frage ist. Warum wird bei Verwendung des obigen Codes kein Bild angezeigt? Auf upping die Zählung bis 9, ich drei Bilder bekommen angezeigt, bis 12 erhalte ich sechs Bilder angezeigt und so weiter

+0

Schließen Sie die Klammern für image_tag – radubogdan

+0

Verwenden Sie Rails 5? Wenn ja, können Sie 'user.posts.left_join (: media)' verwenden, um sicherzustellen, dass den zurückgegebenen Posts ein 'media' zugeordnet ist. Wenn Sie Rails 5 nicht verwenden, können Sie den Join manuell definieren (https://apidock.com/rails/ActiveRecord/QueryMethods/joins). Und das löst auch Ihr n + 1-Abfrageproblem. – MrYoshiji

Antwort

3

Zunächst einmal sollten Sie nicht die Anrufe an die db/Modell machen (mit limit) in der Ansichten. Rufen Sie es direkt in der Steuerung: @posts = user.posts.order(created_at: :desc).limit(6)

Dann würde ich einige Debugging tun, um sicher zu sein, dass Sie die Datensätze haben, die Sie wollen.

Verwenden Sie Byebug zum Beispiel und rufen Sie es auf, nachdem Sie @posts Instanzvariable gesetzt haben, um zu sehen, was es enthält. Enthalten alle Beiträge ein Medium?

+0

eine andere Option ist ein 'else' Block für die' if post.media.present? 'Und etwas wie" "keine Medien für Post # {post.id}" – MrYoshiji

+0

Ich wusste, dass dies kommen würde. Aus meiner Sicht sehe ich auch alle Benutzer Beiträge und ich beabsichtige nicht, diese zu begrenzen. Die Alternative war, eine andere Variable zu erstellen, um damit umzugehen, aber das würde mich dazu bringen, zweimal die Datenbank für die gleiche Ressource abzufragen, nicht wahr? Und ja. Ich hatte dies auch versucht –

+0

@MrYoshiji, für meine Codes Zwecke, das funktioniert gut, denn es gibt einige HTML-CSS-Code vorhanden. Ich möchte sie nicht rendern, wenn keine Bilder gefunden werden –

Verwandte Themen