2012-10-01 19 views
16

Ho una categoria con un elenco di elementi. Gli articoli hanno una posizione e la categoria ha una relazione has_many: items,: order => "position". Quando un utente aggiorna un valore di posizione, voglio vedere la sua posizione. La mia posizione è un galleggiante per consentire lo spostamento tra numeri arrotondati.binari - come aggiornare un'associazione dopo un salvataggio

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 

Quanto sopra funziona ma sembra davvero prolisso. C'è un modo per me di dire sull'articolo salvare che la relazione di categoria deve essere aggiornata poiché l'ordine potrebbe essere cambiato?

risposta

25

È possibile utilizzare item.reload per il recupero del modello dal database e la volta successiva che si chiama un'associazione, verrà recuperato.

4

Rails 4 aggiornerà gli oggetti associati a has_many/belongs_to per te quando cambiano, ma non eseguirà nuovamente la query, il che significa che anche se gli elementi in category.items verranno aggiornati non saranno in ordine . A seconda della dimensione dei tuoi tavoli potresti voler usare ruby ​​per ordinare il risultato o usare category.reload per ottenerli in ordine.

Vedi le RailsGuides a http://guides.rubyonrails.org/association_basics.html e cercare inverse_of

32

Per le associazioni singolo elemento:

book.reload_author 

Per le altre associazioni:

author.books.reload 

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


Nelle versioni precedenti di binari, prima di Rails 5, è possibile passare true a un metodo di associazione come primo parametro per farlo ricaricare: author.books(true).

+2

Chi viene ancora a questa risposta dalla ricerca (come ho appena fatto): questo comportamento non è più supportato da binari. Riceverai un avviso di ritiro. Il nuovo modo per le raccolte è di usare il metodo 'reload' sul proxy di raccolta. – klaustopher

+0

@klaustopher Grazie. Aggiornato la mia risposta. –

+1

"AVVISO DI DEPRESSIONE: Passare un argomento per forzare un'associazione a ricaricare è ora deprecato e verrà rimosso in Rails 5.1. Si prega di chiamare' reload' sull'oggetto padre invece. (Chiamato da

a (pry): 2) " – Dorian

Problemi correlati