2010-11-19 14 views
1

Ich habe eine Anwendung erstellt, wo ich Benutzern erlaube, ihre Workouts zu protokollieren.Die Logik aus der Sicht zu bekommen ... Hilfe mit named_scope

Der Benutzer kann ein privates oder öffentliches Protokoll seiner Trainingseinheiten speichern und wird durch ein check_box-Feld gekennzeichnet, das die Ganzzahl 1 an die Spalte workout.share übergibt. Das private Protokoll kann über den workouts_controller eingesehen werden, wo ich alle Ausgaben durch Filtern nach current_user einschränke.

workouts_controller.rb

@workouts = current_user.Workouts.all 

Die öffentlichen Trainingseinheiten sind durch einen separaten community_controller gezeigt und es nenne ich das Training wie dieses

community_controller

@workouts = Workouts.all 

und Filtern dann die Ergebnisse in der sehen Sie mit dem folgenden

<% @workouts.each do |workout| %> 
<% if workout.share == 1 %> 
    ... 
<% end %> 
<% end %> 

Beste Ich kann sagen, dies ist nicht die bevorzugte Möglichkeit, dies zu tun, und mein Verdacht ist, dass ich ein named_scope möchte, so dass ich eine neue Variable erstellen kann @shared_workouts. Das heißt, dass ich mit den benannten Bereichen nicht vertraut bin, also könnte ich etwas Hilfe verwenden, wo und was die richtige Syntax ist.

+0

Welche Version von Rails? –

Antwort

1

Wenn Sie mit Schienen 2, verwenden Sie die folgenden Schritte aus:

class Workout < ActiveRecord::Base 
    named_scope :shared, :conditions => {:share => 1} 
end 

Wenn Sie diese Schienen 3, verwenden Sie stattdessen verwenden:

class Workout < ActiveRecord::Base 
    scope :shared, where(:share => 1) 
end 

Dann in der Community-Controller, können Sie einfach verwenden @workouts = Workouts.shared.all

1

Wie Peter oben erwähnt, verwenden Sie ein named_scope/scope entsprechend der von Ihnen verwendeten Rails-Version. Außerdem möchten Sie nicht den Wert 1 für Ihren Test verwenden. Sie möchten true verwenden (wenn Sie den Typ boolean in Ihrer Migration verwendet haben).

Der Grund ist, wenn Sie die Datenbank ändern, kann es anders gespeichert werden (SQLite hat einen booleschen Typ zum Beispiel, verwendet mySQL eine winzige int ...), und Active Record wird es für Sie verwalten. :)

class Workout < ActiveRecord::Base 
    named_scope :shared, :conditions => {:share => true} 
end 

Oder

class Workout < ActiveRecord::Base 
    scope :shared, where(:share => true) 
end 

Verwenden Sie dann "Workouts.shared", um den named_scope zugreifen.

Verwandte Themen