2016-05-03 9 views
0

Im Moment spiele ich mit Rails herum, um den Dreh und die Programmierung im Allgemeinen zu bekommen. Deshalb habe ich meine erste Rails-App erstellt, in der ich meine Spiele (aus der Spieldatenbank) auf einer der Seiten anzeigen und nach einer in den einzelnen Funktionen berechneten Variablen sortieren möchte. Meine Ansicht Seite sieht wie folgt aus (vereinfacht):Verwenden von Variablen innerhalb jeder Funktion zu sort_by

<% @games.sort_by{|game| ???}.each do |game| %> 

<p>Userexp:  <%= game.userexp1 %></p> 
<p>Userexpscore: <% if (game.userexp1 <= 60) %> <%= @UserexpScore = 1 %> 
       <% elsif (game.userexp1 > 60) %> <%= @UserexpScore = 2 %> = 2 <% end %></p> 

<p>Price:  €<%= game.price %></p> 
<p>Pricescore: <% if (game.price <= 20) %> <%= @PriceScore = 2 %> 
       <% elsif (game.price > 20) %> <%= @PriceScore = 1 %> <% end %></p> 

<p>Finalscore: <%= @FinalScore = @UserexpScore + @PriceScore %></p> 

<% end %> 

ich, wie ich sie von game.userexp1 oder game.price bestellen kann, aber ich kann nicht herausfinden, ob es möglich ist, sie durch @FinalScore zu sortieren (ohne auch den userexpscore und pricescore in die Datenbank zu setzen). Ich habe mich gefragt, ob das möglich ist und wenn ja, wie kann ich das machen?

Vielen Dank im Voraus!

+0

Sie etwas sagen könnte, wie '<% @ games.sort_by {| Spiel | Spiel [: created_at]}. jedes tun | Spiel | %> 'um die Spiele nach ihrem Attribut ** created_at ** zu sortieren, wenn das Attribut existiert. – aonemd

+0

Vielen Dank für Ihre schnelle Antwort, aber ich möchte sie wirklich mit der @ Finalscore Variable mit jeder Funktion sortieren. Wenn das natürlich auch möglich ist. – Neal

+0

Sie müssen ein bisschen Refactoring machen. Ausarbeitung einer Antwort ... –

Antwort

3

Ansicht ist nicht der richtige Ort für Geschäftslogik.

Sie können Punktzahl bewegen Logik in Modell zu berechnen, zB:

class Game < ActiveRecord::Base 
    def userexp_score 
    userexp1 <= 60 ? 1 : 2 
    end 

    def price_score 
    price <= 20 ? 2 : 1 
    end 

    def final_score 
    userexp_score + price_score 
    end 
end 

Dann im Blick

<% @games.sort_by(&:final_score).each do |game| %> 
    <p>Userexp: <%= game.userexp1 %></p> 
    <p>Userexpscore: <%= game.userexp_score %></p> 
    <p>Price:  €<%= game.price %></p> 
    <p>Pricescore: <%= game.price_score %></p> 
    <p>Finalscore: <%= game.final_score %></p> 
<% end %> 

Ich schlage vor, Sie über MVC und Trennung von Bedenken lesen

+0

Vielen Dank für Ihre Antwort! Es hat den Trick gemacht. Und ich habe viel daraus gelernt. – Neal

+0

Schöne und saubere Lösung. Daher werde ich versuchen, die durch Methode zurückgegebenen "1" und "2" als einige Konstanten zu bezeichnen. Wahrscheinlich können Sie auch auf db-Ebene sortieren? – Sebastian

+0

Daumen hoch für das Aufzeigen einer Lösung mit Symbol # to_proc. – luizrogeriocn

Verwandte Themen