2009-06-01 5 views
0

Disclaimer: Meine ursprüngliche Exposition gegenüber Ruby on Rails war buchstäblich vor Jahren, und eine große Menge Dinge sind neu für mich jetzt, dass ich es wieder abholen. Eines dieser Dinge nennt man Bereiche. Sie scheinen großartig, aber ich bekomme nicht das Ergebnis, das ich erwarte. Hier ist ein for-Beispiel:named_scope erstellt neue Objekte, wenn ich es mit einem verwende: Join

class User 
    has_many logs 
    named_scope :logged_in, :joins => ['logs'], :conditions => ['logs.logout_at IS NULL'] 
end 

Class Log 
    belongs_to user 
end 

Es ist mein Verständnis, dass ein

User.logged_in 

genau das tun, soll das gleiche wie tut ein

User.find(:all, :joins => ['logs], :conditions => ['logs.logout_at IS NULL']) 

Aber stattdessen ich bin immer wieder verschiedene Objekte. Um zu demonstrieren:

real = User.find_by_name('admin') 
    #<User id:12345, name: 'admin' ... > 
fake = User.logged_in.find_by_name('admin') 
    #<User id: 54321, name: 'admin' ... > 

Also meine Frage ist: Wo auf der Erde dieses neue Objekt herkommt, und wie bekomme ich named_scope geben Sie mir das Original?

+1

Das Problem, wie sich herausstellt, ist mit Rails 2.1 und seine Gewohnheit zusammen zu zerschlagen die Ergebnisse von Joins, wenn Sie sie in Bereichen verwenden. Detaillierte hier: http://selfamusementspark.com/blog/2008/07/10/named_scope-joins-includes/ Die Antwort unten war eine hervorragende Problemumgehung! – Atiaxi

Antwort

3
named_scope :logged_in, 
      :conditions => ["logs.logout_at IS NULL"], 
      :include => :logs 
0

Es sieht aus wie Sie mehrere Benutzer namens ‚admin‘

haben Versuchen Sie folgendes:

User.find_all_by_name('admin') 
+0

Leider ist es nicht die einfache Antwort; Diese Abfrage gibt genau ein Ergebnis zurück, das ich oben als "echt" bezeichnet habe. – Atiaxi

Verwandte Themen