2016-10-27 3 views
0

Derzeit, wenn eine Person auf die link_to klickt, werden sie zur vorherigen oder nächsten Herausforderung gebracht.Nächste und vorherige durch @ Benutzerobjekt?

Aber wie kann link_to arbeiten, wo nur @user `s Herausforderungen enthalten sind?

Ansicht

<% if @challenge.previous %> 
    <%= link_to 'Prev', challenge_path(@challenge.previous), class: "footer-left", style: "color: white; font-style: normal;" %> 
<% else %> 
    <%= link_to 'Home', root_url, class: "footer-left" %> 
<% end %> 

<% if @challenge.next %> 
    <%= link_to 'Next', challenge_path(@challenge.next), class: "footer-right" %> 
<% else %> 
    <%= link_to 'Home', root_url, class: "footer-right" %> 
<% end %> 

Modell

def next 
    Challenge.where("id > ?", id).first # I get nil error for... Challenge.find_by(user_id: @user.id).where("id > ?", id).first 
end 

def previous 
    Challenge.where("id < ?", id).last # I get nil error for... Challenge.find_by(user_id: @user.id).where("id > ?", id).last 
end 

Ich weiß @user im Modell nicht funktioniert, aber ich benutze es nur als ein Beispiel für den Versuch, das bekommen User, zu deren Herausforderungen sie gehören.

+0

Gibt es eine 'has_many'-Beziehung zwischen Benutzer und Challenge? – mysmallidea

+0

Funktioniert es jemals oder nur einmal, wenn Sie die letzte Herausforderung erreichen –

+0

'@ user.challenges.where ('id>?', @ Challenge.id) .first 'sollte die Challenge mit der nächst höheren ID zurückgeben, unter der Annahme, dass a Benutzer hat viele Herausforderungen. – Stefan

Antwort

1

die Benutzer chalenges Für Ich gehe davon aus, dass Ihre Modelle wie folgt aussehen:

class User < ApplicationRecord 
    has_many :challenges 
end 

class Challenge < ApplicationRecord 
    belongs_to :user 
end 

So sollte Ihre Methode:

class Challenge < ApplicationRecord 
    belongs_to :user 

    #don't use just "next" because it's a ruby reserved keyword that you can use to skip to the next iteration of a loop 
    def next_user_challenge 
    user.challenges.where('id > ?', id).first 
    end 

    def previous_user_challenge 
    user.challenges.where('id > ?', id).last 
    end 
end 

Und noch einen Punkt, um die nächste und vorherige durchsuchen Herausforderungen denke ich, dass wäre besser, wenn Sie das Datum der Herausforderung oder ein anderes Attribut vergleichen. Beispiel:

#next challenge 
user.challenges.where('challenge_date > ?', challenge_date).order('challenge_date ASC').first 

#previous challenge 
user.challenges.where('challenge_date < ?', challenge_date).order('challenge_date ASC').first 
+0

Das ist fantastisch! Vielen Dank! Ich verwende zwei separate Datumskategorien für Herausforderungen: "Deadline" und "Date_Started". Kennst du einen Weg, wie ich beide miteinander vernetzen kann? –

Verwandte Themen