2012-07-04 17 views
5

dopo l'uso intensivo di google Ho ora indicato un problema che sembra non verificarsi spesso, ma è ancora molto semplice. Liste collegate nel record attivo. Per quanto io sono ora, abbiamo bisogno di due associazioni nel modello:Rails ActiveRecord Model Linked List

class Child < ActiveRecord::Base 
    belongs_to :parent 
    belongs_to :next, :class_name => 'Child', :foreign_key => 'next_id' 
    belongs_to :previous, :class_name => 'Child', :foreign_key => 'previous_id' 
end 

Così ora siamo in grado di ottenere tutti i figli di un genitore:

children = Child.where("parent_id = ?", parent_id) 

E ora alla domanda: voglio naturalmente per ottenere tutti i bambini dal database con una query, ma voglio anche passare attraverso i bambini nell'ordine collegato, il che significa che il primo sarà il bambino con l'attributo precedente di nil, il figlio successivo sarà quello connesso dal primo attributo seguente, e così via fino a quando il prossimo attributo è nullo. E 'possibile farlo in questo modo, o devo interrogare il primo figlio, e poi passare da bambino a figlio senza "precaricare"?

+0

bambini? bambini – Maysam

risposta

2

Le gemme resort e ranked-model sono altre alternative. Il primo utilizza un approccio simile alle liste collegate. Il secondo utilizza un attributo di posizione.

+0

Finalmente abbiamo finito per utilizzare il modello classificato –

1

Probabilmente dovresti usare la gemma Rails acts_as_list. Memorizza la posizione dell'elemento nell'elenco e persino gli ambiti rispetto agli oggetti padre per gli elenchi e belongs_to. risolverebbe anche questo problema consentendo di interrogare tutti gli elementi e quindi ordinarli correttamente.

+1

Anche il pensiero mi è passato per la mente, ma act_as_list non ti offre un vantaggio importante per la lista collegata: l'inserimento e la rimozione a basso costo da posizioni arbitrarie. – Chowlett

+0

bello sapere la gemma act_as_list (perché fino ad ora, ho fatto questa implementazione da solo) ma esattamente questo è quello che voglio fuggire da .... se si elimina un oggetto, voglio solo cambiare gli attributi del precedente e il prossimo modello, e non passare attraverso centinaia di righe cambiando l'attributo di posizione –

+1

Puoi sovrascrivere il metodo 'destroy' e farlo in modo che aggiorni gli attributi dei suoi vicini. – Draiken