2011-02-24 12 views
15

Por lo tanto, estoy trabajando en una aplicación en la que deseo que los usuarios puedan agrupar objetos en "carpetas". Básicamente:Rieles: ¿Cómo funcionan los modelos autorreferenciales has_many?

User has_many :foos

Foos no tiene que estar en una carpeta, pero puede ser. En ese caso:

Folder has_many :foos y Foo belongs_to :folder

Ahora, me gustaría ser capaz de configurar las carpetas para que puedan anidarse. Creo que esto es algo así como ...

Folder has_many :folders

He oído que este tipo de relación autorreferencial no es gran cosa, pero yo realmente no entiendo cómo funciona. No he podido averiguar cómo se supone que se debe declarar en el modelo y qué columnas debo proporcionar en la base de datos.

¿Alguien podría dar un ejemplo? También me gustaría valorar cualquier sugerencia/advertencia/advertencias/lecciones aprendidas que pueda ofrecer sobre la configuración de este tipo de relación en una aplicación.

Gracias! respuesta

Respuesta

30

Pedido de coreyward a la pregunta aquí: Creating a model that has a tree structure

Básicamente desea agregar un campo "parent_id" a su mesa carpetas y luego configurar una relación en el modelo de carpetas así:

belongs_to :parent, :class_name => "Folder" 
has_many :folders, :foreign_key => "parent_id" 
+1

Estoy bastante seguro de que no necesita el ': foreign_key =>" parent_id "' en la línea belongs_to. Solo debería estar en la línea has_many, ¿sí? – 3nafish

+0

@ 3nafish gracias y buena captura. Actualizaré la respuesta –

+1

Si desea ponerle otro nombre a la relación infantil, p. 'children_folders' entonces necesitas especificar el nombre de clase:' has_many: children_folders,: foreign_key => "parent_id",: class_name => "Folder" ' – AJP

Cuestiones relacionadas