Un padre --> varios hijos (simple pero me he liado)

Mi consulta es tan de principiante que casi me da hasta verguenza, pero
creo q lo estoy haciendo mal y he tomado un camino incorrecto.

para simplificar supongamos que partimos de un proyecto desde cero.

Tenemos una bD para padres e hijos

padres:
id, Nombre

hijos:
id, padre_id, nombre

en rails digamos que no me complico la vida (repito esta simplificado)
y hago un scaffold

$> ruby script/generate scaffold padre padre

y con esto me genera todo lo que necesito para el padre.
solo me falta añadir: has_many :hijos al modelo padre.rb

todo perfecto y bien (el scaffold es genial)

ahora le toca a los hijos (que solo tiene padre, y dejamos descansar a
las sufridas madres)

seria perfecto que al mostrar por medio de Show/1 al padre 1, debajo
apareciera todos sus hijos.

pUES HE METIDO TAL LIO, creando modelos, controladores, pasando
parametros, haciendo plantillas parciales con Render (listhijos) …

tal lio que ensegida me di cuenta, que no tome el camino adecuado y q no
estoy usando bien los objetos.

LES SUPLICO que me indiquen por donde tengo que continuar, pq no voy por
el camino que toca, no quiero que me detallen que es lo q tengo q hacer
(o nunca aprendere) pero agradeceria que me diesen algunas directrices
que orientasen mi rumbo o me indicaran algun ejemplo sobre el que apoyar
mi aprendizaje para hacer una simple aplicacion de padre e hijos.

Quizá te resulte útil el método acts_as_tree, parece ideal para lo que
planteas:

http://api.rubyonrails.org/classes/ActiveRecord/Acts/Tree/ClassMethods.html

Saludos,
Raúl

lamacarena escribió:

On Fri, Oct 20, 2006 at 06:22:04PM +0200, lamacarena wrote:

hijos:
id, padre_id, nombre

[…]
seria perfecto que al mostrar por medio de Show/1 al padre 1, debajo
apareciera todos sus hijos.

Hmmm... si sólo quieres un nivel, ¿por qué no obtienes los hijos, 

los
dejas en una variable tipo @hijos, y haces un hueco en la vista para
mostrar
esa lista?

Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?= wrote:

On Fri, Oct 20, 2006 at 06:22:04PM +0200, lamacarena wrote:

hijos:
id, padre_id, nombre

[…]
seria perfecto que al mostrar por medio de Show/1 al padre 1, debajo
apareciera todos sus hijos.

Hmmm... si sólo quieres un nivel, ¿por qué no obtienes los hijos, 

los
dejas en una variable tipo @hijos, y haces un hueco en la vista para
mostrar
esa lista?

gracias a los dos:

Raul lo del arbol esta muy interesante, pero solo me sirve para
jerarquies en una misma tabla, te todas formas lo estudiare, pues parece
muy interesante.

Esteban:
Lo que me dices es donde me atasque,

quiero lo q no me acalro a es metere en la variable @hijos los hijos de
un padre.

Puse esto en el controlador:

def listardetalles
@hijo = Hijo.find(params[:padre_id])
end

pero no me funciono, no tengo ahora el error pero lo busco.

On Oct 21, 2006, at 6:47 PM, lamacarena wrote:

Puse esto en el controlador:

def listardetalles
@hijo = Hijo.find(params[:padre_id])

Dado el padre_id, el camino directo hacia los hijos va asi:

@hijos = Padre.find(params[:padre_id]).hijos

– fxn

Vamos a ver si esto te puede servir

def listardetalles
@hijo = Hijo.find( :all, :conditions => [“id = :id_padre”,
{ :id_padre => params[:padre_id] } ] );
end

Otra opción seria buscar todos los hijos y acceder a los padres desde
el array de objetos @Hijo

def list
@hijos = Hijo.find( :all, :order => “padre_id” )
end

vista

    <% @hijos.each do | hijo | %>
  • padre: <% hijo.padre.nombre %> _ hijo: <% hijo.nombre %>
  • <% end %>

(espero que este bien)

LES SUPLICO que me indiquen por donde tengo que continuar, pq no
voy por
el camino que toca, no quiero que me detallen que es lo q tengo q
hacer
(o nunca aprendere) pero agradeceria que me diesen algunas directrices
que orientasen mi rumbo o me indicaran algun ejemplo sobre el que
apoyar
mi aprendizaje para hacer una simple aplicacion de padre e hijos.

Vaya, tenia que haber leído el post completo.
Como orientación y a mi me sirvió para empezar a orientarme un poco
con rails y eso que a torpe no me gana nadie fue dejar de usar
scaffold, ya que me liaba mucho.

Un saludo.

finalmente hice esto:
creo que me salté a la torera los principios rails de MCV
haciendo todo el trrabajo en la vista.
creo esto tendria q ir al controlador, pero no me he aclarado.
<% @hijos = @padre.hijos.find(:all) %>

y gracias a todos por vuestra ayuda.

<% for column in Padre.content_columns %>

<%= column.human_name %>: <%=h @padre.send(column.name) %>

<% end %>

<% @hijos = @padre.hijo.find(:all) %>

Listing hijos

<% for column in Hijo.content_columns %> <% end %>

<% for hijo in @hijos %>

<% for column in Hijo.content_columns %> <% end %> <% end %>
<%= column.human_name %>
<%=h hijo.send(column.name) %>

poquito a poco.

ahora ya tengo el detalle del padre y un listado de los hijos,

con el codigo que mostre antes,

como tendria que hacer para añadir un nuevo hijo al padre.

estoy intentando pasar esto:

<%= link_to “Añadir Hijo”, :action => ‘NewHijo’, :id => @padre%>

en el controlador esto:
def newHijo
@hijo = Hijo.new
end

pero de alguna forma tengo q decirle q ese hijo pertenece a ese padre
para que la table se rellene con el padre_id correspondiente.

On Oct 22, 2006, at 10:47 AM, lamacarena wrote:

finalmente hice esto:
creo que me salté a la torera los principios rails de MCV
haciendo todo el trrabajo en la vista.
creo esto tendria q ir al controlador, pero no me he aclarado.
<% @hijos = @padre.hijos.find(:all) %>

Muy bien ahi, el find(:all) no hace falta por eso:

<% @hijos = @padre.hijos %>

finalmente hice esto:
creo que me salté a la torera los principios rails de MCV
haciendo todo el trrabajo en la vista.

Al principio es más importante que funcionen las cosas a que queden
muy elegantes pero hay que aspirar a que la lógica de la aplicación
esté en su sitio (controlador y modelo):

Este artículo te dará algunas pistas

http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model/comments/802

On Oct 22, 2006, at 12:35 PM, lamacarena wrote:

<%= link_to “Añadir Hijo”, :action => ‘NewHijo’, :id => @padre%>

en el controlador esto:
def newHijo
@hijo = Hijo.new
end

pero de alguna forma tengo q decirle q ese hijo pertenece a ese padre
para que la table se rellene con el padre_id correspondiente.

Exacto, para eso hay varios idiomas. Uno habitual es (el nombre de
los metodos en Ruby suele estar en snake case):

def new_hijo
@padre = Padre.find(params[:id])
@hijo = Hijo.new
@padre.hijos << @hijo
end

Observa que no llamamos a save ni de uno ni de otro, añadir a la
coleccion pone la llave foranea y hace el INSERT directamente (<<
devuelve false si fallo).

AR es un framework tremendamente util y merece la pena conocerlo bien
(bueno, conocerla bien lo merece cualquier tecnologia en la cual
basemos nuestro trabajo), echandole una leida a la documentacion de
ActiveRecord::Base en http://api.rubyonrails.com podras ir viendo
como van las cosas.

– fxn