2012-10-01 5 views
16

Ich habe eine Kategorie mit einer Liste von Elementen. Die Artikel haben eine Position und die Kategorie hat eine Beziehung has_many: items,: order => "position". Wenn ein Benutzer einen Positionswert aktualisiert, möchte ich seine Position sehen. Meine Position ist ein Gleitkomma, um zwischen gerundeten Zahlen wechseln zu können.Rails - Wie man eine Verbindung nach einem Speichern aktualisieren

pos=item.category.items.map(&:id) 
current_position=pos.index(id.to_i) 
item.save # want to refresh the relationship here 
pos_new=item.categoty.items.map(&:id) 
# grabbing this since just accessing item isn't updated if positioning has changed 
item_new=Item.find(id) 
pos_new=item_new.category.items.map(&:id) 
new_position=pos_new.index(id) 
if current_position!=new_position 
    is_moved=true # sent back in JSON to propagate a dynamic change. 
end 

Das obige funktioniert, aber es scheint wirklich ausführlich. Gibt es eine Möglichkeit für mich, auf Artikel zu speichern, dass die Kategorie Beziehung aktualisiert werden muss, da die Reihenfolge geändert werden konnte?

Antwort

25

Sie können item.reload verwenden, die das Modell aus der Datenbank abrufen und das nächste Mal, wenn Sie eine Verknüpfung aufrufen, wird es erneut abrufen.

4

Rails 4 aktualisiert Ihre has_many/gehört_zu assoziierten Objekte für Sie, wenn sie sich ändern, aber die Abfrage wird nicht erneut ausgeführt, was bedeutet, dass die Elemente in den category.items zwar aktualisiert werden, aber nicht in Ordnung sind . Abhängig von der Größe Ihrer Tabellen möchten Sie vielleicht ruby ​​verwenden, um das Ergebnis zu sortieren, oder category.reload verwenden, um sie in die richtige Reihenfolge zu bringen.

die RailsGuides bei http://guides.rubyonrails.org/association_basics.html Sehen und sucht inverse_of

32

Für Einzelpl Verbände:

book.reload_author 

Für andere Verbände:

author.books.reload 

http://guides.rubyonrails.org/association_basics.html#controlling-caching


In älteren Schienenversionen können Sie vor Rails 5 true an eine Assoziationsmethode übergeben, die als erster Parameter neu geladen werden muss: author.books(true).

+2

Wer kommt noch zu dieser Antwort von der Suche (wie ich gerade tat): Dieses Verhalten wird nicht mehr von Schienen unterstützt. Sie erhalten eine Verwarnungswarnung. Der neue Weg für Collections besteht darin, die Methode 'reload' für den Collection-Proxy zu verwenden. – klaustopher

+0

@klaustopher Danke. Meine Antwort wurde aktualisiert. –

+1

"ABWEICHUNGSWARNUNG: Das Übergeben eines Arguments zum Erzwingen einer Zuordnung zum erneuten Laden ist jetzt veraltet und wird in Rails 5.1 entfernt. Rufen Sie stattdessen' reload' für das übergeordnete Objekt auf. (Von

bei (m) abgerufen: 2) " – Dorian

Verwandte Themen