Crear categorías de producto


#1

Hola de nuevo,

Necesito crear un modelo Speciality para crear las especialidades
(médicas) de los usuarios (modelo User)
En principio solo va a tener dos niveles:

  • specilities
    – subespecialities
    (supongo que la pluralización será esa)
    Pero no es descartable que más adelante pueda haber más niveles.

Me suena que tengo que hacer una relacion del modelo consigo mismo y
utilizar “acts_a_tree”. Pero no se ahora mismo cómo montar todo el
tema a nivel controlador y vistas.

Mi idea de cómo montarlo:
Una migración tal que
así. t.string :name
t.integer :parent_id

Class Speciality
acts_as_tree :order => “name”

belongs_to :parent, :class_name => “Speciality”
has_many :children, :class_name => “Speciality” ,
:foreign_key => “parent_id” ,
:order => “name” ,
:dependent => :destroy
end

Class User

Otras relaciones

belongs_to_many :specialities

¿Hasta ahí bien no?

Pues a partir de ahí no se cómo seguir.
He buscado refenrencias en los libros y tutoriales en Google pero no
encuentro nada que me de pistas.

¿Algun tutorial de referencia?

Muchas gracias de antemano.


Fernando V.
Web Designer
http://www.fernandoval.es


#2

He avanzado algo gracias un mini tutorial algo viejo que he encontrado
por ahí, pero que he tratado de adaptar a REST:
http://railsforum.com/viewtopic.php?id=1560

He instalado el plugin “acts_a_tree”

Tengo el modelo
así:class Category < ActiveRecord::Base
acts_as_tree :order => “name”

Validations

validates_presence_of :name
validates_numericality_of :parent_id
end

He metido tres categorías en la tabla:
parent_id, name, id
0 Specialities 1
1 Surgery 2
2 Internal Surgery 3

El controlador:
def index
@categories = Category.find(:all)
end

Y la vista index.html.rb:

    <% for category in Category.find_all_by_parent_id(nil) %>
  • <%= category.name %> <% if Category.find_all_by_parent_id(category).empty? %> no subcategories <% else %>
      <% for category in Category.find_all_by_parent_id(category) %>
    • <%= category.name %>
    • <% end %>
    <% end %>
  • <% end %>

No me da ningún error, pero no me pinta nada.
¿Alguien puede echarle un ojo al código, a ver que hago mal?
Sospecho que el problema está en el view…
Un alma caritativa po dió… :slight_smile:

El día 4 de mayo de 2009 10:05, Fernando removed_email_address@domain.invalid
escribió:> Me suena que tengo que hacer una relacion del modelo consigo mismo y


Fernando V.
Web Designer
http://www.fernandoval.es


Fernando V.
Web Designer
http://www.fernandoval.es


#3

Bueno, he encontrado un ejemplo que me ha abierto un poco la luz.
Bffff, pero me ha costado encontrar algo que explique para dummies como
yo…
http://snippets.dzone.com/posts/show/1919

Ahora sólo me queda aderezar un poco el formulario de new y edit para
no poner el id del padre, sino que me despliegue un select con las
categorías…
Eso creo que podré hacerlo, si me atasco os pido ayuda.

Un saludito.

El día 4 de mayo de 2009 20:47, Fernando removed_email_address@domain.invalid
escribió:> validates_presence_of :name

El controlador:
no subcategories

> (médicas) de los usuarios (modelo User) > Mi idea de cómo montarlo: > :order => "name" , > He buscado refenrencias en los libros y tutoriales en Google pero no > http://www.fernandoval.es >


Fernando V.
Web Designer
http://www.fernandoval.es


Fernando V.
Web Designer
http://www.fernandoval.es


#4

2009/5/5 Fernando removed_email_address@domain.invalid

Nada, que se me atasca el formulario.
Tengo el siguiente método en el controller:
def new
@categories = Category.find(:all) # Cargo todas las categorías
@category = Category.new
end

Y en la vista del _form:
<%= f.label :parent_specialitie %>

<%= f.collection_select(:category, @categories, :id, :name) %>

Uhm…¿<%= f.collection_select(:parent_id, @categories, :id, :name) %>?

No sé si se me está escapando algo.


Diego Fernández Fernández

http://walkaways.es
http://simplelogica.net


#5

Creo que también probé así, pero lo vuelvo a intentar…

El día 5 de mayo de 2009 10:01, Diego Fernandez
removed_email_address@domain.invalid
escribió:>>

http://walkaways.es
http://simplelogica.net


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando V.
Web Designer
http://www.fernandoval.es


#6

Por cierto, el primer parametro no dice la API de Rails que debe ser
el object?. Yo ahí por object entendí el modelo.
Pero debo estar equivocado… es mi novatez. :wink:

Lo dicho ahora cuando tenga un rato en el curro, lo pruebo y os cuento.

El día 5 de mayo de 2009 11:11, Fernando removed_email_address@domain.invalid
escribió:>>> @categories = Category.find(:all) # Cargo todas las categorías


Fernando V.
Web Designer
http://www.fernandoval.es


Fernando V.
Web Designer
http://www.fernandoval.es


#7

Gracias Diego, ahora rula perfecto.

Era error de novato, jejejeje.

Por cierto, una preguntilla:
¿El has_an_belongs_to_many en el modelo, es necesario, o con el plugin
del acts_a_tree ya no hace falta?

Lo digo, porqueen el tuto que acts_a_tree, no dice que sea neceario.
Se lo he puesto yo porque me lo dictaba la lógica.

El día 5 de mayo de 2009 11:14, Fernando removed_email_address@domain.invalid
escribió:>>>

<%= f.label :parent_specialitie %>

http://simplelogica.net

http://www.fernandoval.es


Fernando V.
Web Designer
http://www.fernandoval.es


#8

2009/5/5 Fernando removed_email_address@domain.invalid

Por cierto, el primer parametro no dice la API de Rails que debe ser
el object?. Yo ahí por object entendí el modelo.
Pero debo estar equivocado… es mi novatez. :wink:

La documentación de la API especifica que collection_select recibe
object,
method, collection, value_method, text_method, options = {},
html_options =
{}; Y no sé que más decirte… tu le pasas… otras cosas u en otro
orden.

f.collection_select(:category, @categories, :id, :name)

Me supongo que tienes un form_builder parecido a esto:

<% form_for @category do |f| %>
[…]
<% end %>

En ese caso <%= f.collection_select(:parent_id, @categories, :id, :name)
%>
es lo mismo que <%= collection_select(:category, :parent_id,
@categories,
:id, :name) %>

2009/5/5 Fernando removed_email_address@domain.invalid

<%= f.collection_select(:category, @categories, :id, :name) %>

Fernando V.


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Diego Fernández Fernández

http://walkaways.es
http://simplelogica.net


#9

Nada, que se me atasca el formulario.
Tengo el siguiente método en el controller:
def new
@categories = Category.find(:all) # Cargo todas las categorías
@category = Category.new
end

Y en la vista del _form:
<%= f.label :parent_specialitie %>

<%= f.collection_select(:category, @categories, :id, :name) %>

Y nada, me dice que:

undefined method `category’ for #Category:0x5b9f474

Extracted source (around line #12):

9:
10:


11: <%= f.label :parent_id %>

12: <%= f.collection_select(:category, @categories, :id, :name) %>
13:


14:


15: <%= f.submit “Update” %>

Creo que el problema está al llamarse a sí mismo cómo modelo “:category”.
Pero no hayo la solución. Incluso he puesto la
relación"has_and_belongs_to_many :categories" en el modelo.
Pero nada, sigue dando el mismo problema.
¿Alguien sabe que me pasa?

Gracias de antemano.

El día 4 de mayo de 2009 22:37, Fernando removed_email_address@domain.invalid
escribió:>

validates_presence_of :name
El controlador:
no subcategories

> (médicas) de los usuarios (modelo User) > Mi idea de cómo montarlo: > :order => "name" , > He buscado refenrencias en los libros y tutoriales en Google pero no > http://www.fernandoval.es


Fernando V.
Web Designer
http://www.fernandoval.es


Fernando V.
Web Designer
http://www.fernandoval.es


#10

2009/5/5 Fernando removed_email_address@domain.invalid

Gracias Diego, ahora rula perfecto.

Era error de novato, jejejeje.

Por cierto, una preguntilla:
¿El has_an_belongs_to_many en el modelo, es necesario, o con el plugin
del acts_a_tree ya no hace falta?

No hace ninguna falta.

Tengo en cuenta que estás empezando, ahora bien, creo que deberías
parate un
poco a leer o releer alguno de los innumerables
documentos/tutoriales/ejemplos introductorios. Deberías comprender bien
que
son las asociaciones y para qué sirven. Luego pasar a los form_builders,
form_helpers y ver como todo eso encaja. Dejar que todo eso se asiente
bien.
Hacer ejemplos de un tamaño que controles, que sepas lo que está
pasando.

En mi opinión, sin tener una buena base sobre estos y otros conceptos me
parece un poco kamikaze ponerse a desarrollar una aplicación que a las
primeras de cambio “parece” necesitar de una estructura en árbol
autorefereciada.


Diego Fernández Fernández

http://walkaways.es
http://simplelogica.net


#11

Te doy toda la razón en la segunda parte de tu planteamiento, pero no
en la primera. Me explico:

Partimos de la base, que no soy programador (soy diseñador), pero me
gusta muchísimo.
Hace algo más de dos años que empecé con Rails, pero por distintos
motivos mi aprendizaje ha tenido que parar en varias ocasiones.
Ahora llevo unos dos otres meses que me he metido a saco, caiga quien
caiga. He decidido que tengo que aprender ya de un vez.
Durante todo este tiempo he ido leyendo libros un poco por encima y
por hobbie, también en internet. Últimamente estoy leyendo
másintensivamente. He echo bastantes tutoriales. Pero me encuentro con
que tengo una idea muy teórica de Rails, pero no se por donde empezar.
Así que he decidido “echarme al monte” en plan “kamikaze” cómo tu
dices y empezar a montar una aplicación de verdad con problemas de
verdad. No es ninguna aplicación real, es una toy-application a la que
le voy añadiéndole funcionalidades sobre la marcha.
Quizas os doy un poco la lata con mis torpezas, pero te aseguro que es
más por lo dificil que me resulta todo esto, que por falta de
empeñoen documentarme, googlear, etc.
Cómo soy consciente de ello, procuro aportar las soluciones que yo
mismo encuentro (las menos :slight_smile: ), para que así le pueda servir a otro.
Y ese es el tema, Diego. Muchas gracias.

El día 5 de mayo de 2009 12:12, Diego Fernandez
removed_email_address@domain.invalid
escribió:>> del acts_a_tree ya no hace falta?

En mi opinión, sin tener una buena base sobre estos y otros conceptos me


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando V.
Web Designer
http://www.fernandoval.es


#12

Te entiendo.

Muchas de nadas :slight_smile:

Diego Fernández Fernández

http://walkaways.es
http://simplelogica.net


#13

Si si, si exacto.

El día 5 de mayo de 2009 11:56, Diego Fernandez
removed_email_address@domain.invalid
escribió:> {}; Y no sé que más decirte… tu le pasas… otras cosas u en otro orden.

:id, :name) %>

<%= f.label :parent_specialitie %>

http://simplelogica.net

http://www.fernandoval.es
http://walkaways.es
http://simplelogica.net


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando V.
Web Designer
http://www.fernandoval.es


#14

Mucho ánimo Fernando!

El 5 de mayo de 2009 15:11, Diego Fernandez <
removed_email_address@domain.invalid> escribió: