2009-08-18 2 views
0

Ich habe Modell namens User mit einer has_many Beziehung zu UserFilter. UserFilter hat eine belongs _to-Beziehung zu User.lokale Methoden verhalten sich anders, wenn sie mit/ohne self aufgerufen werden. Warum?

Innerhalb des User-Modells Ich rief eine Methode update_user_filters(filter_params_array)

Diese Methode modifiziert user_filters wie so etwas wie diese

def update_user_filters(filter_params_array) 
    new_filters = [] 
    old_filter = user_filters 

    filters_params_array.each do |filter_params| 
    if filter_params[:id].blank? #if the filter does not yet exist 
     new_filters << UserFilter.new(filter_params) 
    end 
    end 
    user_filters = new_filters 
end 

Das die user_filters den erwarteten Wert setzt aber beim Speichern sie die user_filters nicht aktualisiert in der db.

aber wenn ich die Zuordnung zu den folgenden ändern, tut es. Kann jemand erklären, warum das so ist?

self.user_filters = new_filters 

Beachten Sie, dass, wenn ich zum ersten Mal in dem Modell user_filters beziehen ist hat eine select in der db so bin ich nicht sicher, wie diese lokale Methode mit self anders funktioniert und ohne self

+0

Verwandte Frage: http://StackOverflow.com/Questions/44715/Why-Do-Ruby-setter-Need-Self-Qualification-within-the-Class –

Antwort

6

user_filters schafft nur eine lokale Variable. self.user_filters weist es dem Objekt zu. Sie möchten wahrscheinlich .

+0

Also bin ich ein wenig verwirrt dann. Wenn user_filters und user_filters = dynamisch von active record definiert werden, funktionieren sie dann nicht nur als Methoden? also rufe ich user_filters auf, ich rufe die Methode tatsächlich auf, da ich sie nicht setze und sie die Datensätze beim Aufruf zurückgibt. Ähnlich würde ich erwarten, dass user_filters = die Methode auch von Active Record aufgerufen wird. Aber ich denke, was Sie sagen, ist, dass es nur eine lokale Variable erstellen? Aber wie haben user_filters Werte, wenn es nur eine lokale Variable ist? Hinweis: Ich habe den obigen Code aktualisiert, um klarer zu sein – Will

+0

old_filters oben hat jetzt eine Array-Liste von Filtern, so dass es scheint, dass user_filters nicht lokal ist. Aber wenn ich es das Ende nenne, verhält es sich wie eine lokale Variable für Ihre vorherigen Kommentare – Will

+2

Dies ist ein häufiger Punkt der Verwirrung mit Ruby. Sehen Sie, der Ruby-Interpreter weiß nicht, ob "user_filters =" eine lokale Variable setzt oder eine Methode aufruft - so macht es die erste. Aus diesem Grund benötigen Sie "self.user_filters =", um sicherzustellen, dass die Methode aufgerufen wird und keine lokale Variable festgelegt wird. – ryanb

Verwandte Themen