2012-07-04 13 views
5

después de hacer búsquedas intensivas en Google Voy a decir ahora un problema que parece no ocurrir a menudo, pero que sigue siendo muy básico. Listas enlazadas en registro activo. Por lo que yo soy ahora, necesitamos dos asociaciones en el modelo:Lista activada de Rails ActiveRecord Model

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 

Así que ahora podemos obtener todos los hijos de un padre:

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

Y ahora a la pregunta: Quiero por supuesto para obtener todos los niños de la base de datos con una consulta, pero también quiero examinar a los niños en el orden vinculado, lo que significa que el primero será el niño con el atributo anterior de nil, el próximo niño será el que esté conectado por el primer atributo siguiente, y así sucesivamente hasta que el siguiente atributo sea nulo. ¿Es posible hacerlo así o necesito consultar al primer hijo y luego ir de niño a hijo sin "precaching"?

+0

childs? niños – Maysam

Respuesta

2

Las gemas resort y ranked-model son otras alternativas. El primero usa un enfoque similar a las listas vinculadas. El segundo usa un atributo de posición.

+0

Finalmente terminamos usando el ranking-modelo –

1

Probablemente deberías utilizar la gema Rails acts_as_list. Almacena la posición del elemento en la lista, e incluso los ámbitos para objetos principales para listas y belongs_to. también resolvería este problema permitiéndote consultar todos los elementos y luego ordenarlos correctamente.

+1

La idea también pasó por mi mente, pero acts_as_list no te da el mayor beneficio de una lista enlazada: inserción y eliminación baratas de ubicaciones arbitrarias. – Chowlett

+0

bueno saber la gema acts_as_list (porque hasta ahora, he hecho esta implementación por mí mismo) pero exactamente esto es de lo que quiero alejarme ... si elimino un objeto, solo quiero cambiar los atributos del anterior y el siguiente modelo, y no pasar por cientos de filas cambiando el atributo de posición –

+1

Puede anular el método 'destroy' y hacerlo de modo que actualice los atributos de los vecinos. – Draiken