2010-10-15 12 views
0

Je suis sur Rails 2.3.5. Dans mon application, un utilisateur peut réserver un ou plusieurs créneaux horaires pour un jour spécifique. J'ai défini ce named_scope dans mon modèle à sous:named_scopes et tous

# day time slots 
    named_scope :for_day, lambda { |day| 
    if !day.blank? 
     { :conditions => ['day_of_week = ?', day] } 
    end 
    } 

j'utiliser pour récupérer tous les « créneaux horaires » disponibles en un jour. Cependant, j'ai une page où j'aimerais voir tous les emplacements réservés (en d'autres termes, les emplacements des autres utilisateurs aussi).

Alors, quand je l'appelle /slots URL Je voudrais obtenir chaque emplacement réservé, quand, au lieu que j'appelle/utilisateur/2/slots J'ai besoin que ceux pour l'utilisateur 2.

J'ai ajouté cet itinéraire map.resources :users, :has_many => :slots à mes itinéraires .rb et ce code à mon slots_controller.rb:

def index 
    if params[:user_id] 
     @slots = User.find(params[:user_id]).slots 
    else 
     @slots = Slot.all 
    end 
    end 

S'il vous plaît noter qu'un utilisateur peut également voir les emplacements réservés d'un autre utilisateur seul.

Maintenant, quand j'essaie d'utiliser le: for_day champ nommé ci-dessus pour le tableau Slot.all je reçois:

undefined method for_day for #<Array:0x104441f60>

j'ai pu y remédier en ajoutant named_scope :all, :conditions => {} au modèle d'emplacement, mais il semble une solution étrange pour moi.

Pourriez-vous m'aider?

Répondre

2

La méthode all par défaut renvoie un tableau (par opposition à un objet d'association, qui est retourné par votre named_scope :all), vous ne pouvez donc pas appeler for_day dessus.

Cependant, vous pouvez appeler des étendues nommées directement sur la classe pour laquelle vous les avez définies. Par conséquent, le fait de faire Slot.for_day(day) (sans .all) résoudra votre problème.