Ruby Forum Rails-ES > problema con relaciones

Posted by Maite Piedra (maite)
on 11.08.2008 15:44
hola lista tengo una relacion 1 a muchos entre fuente y url

por otro lado tengo un formulario que me muestra todas las fuentes y sus
url el usuario puede picar mas de una url de cada fuente.
cuando le doy a aceptar quiero que
esos valores se guarden en una tabla,
para despues simplemente leer esta tabla para mostrar los valores por
pantalla sin estar haciendo busquedas
 pero nose como relacionar la tabla (nueva) con el modelo de fuente y
url?? debe estar relacionado no??

he pensado en una relacion muchos a muchos pero si es asi no puedo
guardar las url de una fuente

se entinede
no quiero guardar en una tabla todas las relaciones entre url y fuentes
sino solo aquellas que marque el usuario

espero me puedan ayudar y saludos
Posted by Jaime Iniesta (Guest)
on 12.08.2008 11:34
(Received via mailing list)
El 11 de agosto de 2008 15:44, Maite Piedra <
ruby-forum-incoming@andreas-s.net> escribió:

>
> he pensado en una relacion muchos a muchos pero si es asi no puedo
> guardar las url de una fuente
>
> se entinede


Hola Maite, creo que no lo entinedo :P

¿Puedes pasarnos los códigos de tus modelos Fuente y Url, con sus
relaciones? ¿No sería simplemente... "fuente has_many :urls" y "url
belongs_to :fuente"? ¿O quizá con has_and_belongs_to?

Por otro lado, creo que te puede dar problemas usar la palabra "Url" 
como
nombre de modelo, ¿no es una palabra reservada?
Posted by Manuel González Noriega (Guest)
on 12.08.2008 11:54
(Received via mailing list)
2008/8/11 Maite Piedra <ruby-forum-incoming@andreas-s.net>:
> hola lista tengo una relacion 1 a muchos entre fuente y url
>

Hola Maite,

por favor, tómate tu tiempo y redacta los mensajes con cuidado y de
forma clara para que sean minimamente legibles y comprensibles.
Intenta releerlos antes de enviar para asegurarte de que una persona
que no conozca el problema se pueda hacer una idea aproximada de qué 
te pasa y qué necesitas.

--
Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.
Posted by Maite Piedra (maite)
on 12.08.2008 14:11
hola lista, perdon si no me explique bien.
Vuelvo a exponer mi problema a ver si ahora me sale mejor. :-)

tengo dos modelos  fuentes y direcciones  donde una fuente tiene muchas 
direcciones y una direccion pertenece a una fuente.

class Fuente < ActiveRecord::Base
  has_many :direcciones , :dependent => :destroy
end

class Direccion < ActiveRecord::Base
   belongs_to :fuente
end


class CreateDireccions < ActiveRecord::Migration
  def self.up
    create_table :direccions do |t|
      t.string :categoria
      t.text :descripcion
      t.integer :fuente_id
      t.timestamps
    end

class CreateFuentes < ActiveRecord::Migration
  def self.up
    create_table :fuentes do |t|
      t.string :nombre
      t.text :descripcion
      t.timestamps
    end

puedo tener fuentes sin direccion, pero cada direccion debe tener una 
fuente.
esto me lo hace bien escribo en la tabla direccion el fuente_id

ahora lo que quiero es que se le muestren al usuario todos las fuentes y 
cada una de las direcciones que tienen asociadas dicha direccion, y que 
el usuario pueda elegir varias direcciones y fuentes, y que esa eleccion 
del usuario se guarde en una tabla.

y la pregunta es, la tabla esa donde se guarda lo que elegio el usuario 
debe estar asociada al modelo fuente-1--- *-direccion ??? como??

yo lo he estado pensando y se que queda algo como

fuente-1---*-direccion -*---1-agregadorRSS

pero claro ya esto es muchos a muchos y entonces no puedo guardar la 
relacion entre direccion y fuente como en el 1 a muchos

espero qu me aclaren un poco, a lo mejor yo lo estoy haciendo mas 
complicado de lo que es.

muchas gracias
Posted by Manuel González Noriega (Guest)
on 12.08.2008 14:35
(Received via mailing list)
2008/8/12 Maite Piedra <ruby-forum-incoming@andreas-s.net>:
> y la pregunta es, la tabla esa donde se guarda lo que elegio el usuario
> debe estar asociada al modelo fuente-1--- *-direccion ??? como??
>
> yo lo he estado pensando y se que queda algo como
>
> fuente-1---*-direccion -*---1-agregadorRSS
>
> pero claro ya esto es muchos a muchos y entonces no puedo guardar la
> relacion entre direccion y fuente como en el 1 a muchos
>

Mucho mejor explicado, aunque confieso que el párrafo de la duda me
sigue resultando algo confuso :)

¿Quieres decir que un usuario puede suscribirse a varios feeds? Te
sirve un simple has_many :through, con un modelo intermedio llamado
Suscripción
No me queda claro si el usuario tiene que suscribirse a Fuentes (si
una fuente es por ejemplo un blog y las direcciones son feeds
alternativos rss, atom) o a Direcciones (si la Fuente es un mero
contenedor como "ElPais.com" y cada dirección un feed con distinto
contenido por secciones, etc.) pero en todo caso bastaría con cambiar
la 
asociación



--
Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.
Posted by Jaime Iniesta (Guest)
on 12.08.2008 16:11
(Received via mailing list)
El 12 de agosto de 2008 14:11, Maite Piedra <
ruby-forum-incoming@andreas-s.net> escribió:

> class Direccion < ActiveRecord::Base
>      t.timestamps
> puedo tener fuentes sin direccion, pero cada direccion debe tener una
> fuente.
> esto me lo hace bien escribo en la tabla direccion el fuente_id


OK, ahora ya entiendo lo que tienes, en resumen

* Fuente has_many :direccions
* Direccion belongs_to :fuente
* Usuario


> ahora lo que quiero es que se le muestren al usuario todos las fuentes y
> cada una de las direcciones que tienen asociadas dicha direccion, y que
> el usuario pueda elegir varias direcciones y fuentes, y que esa eleccion
> del usuario se guarde en una tabla.


Ya que cada direccion pertenece únicamente a una fuente, bastaría con 
que
apuntaras qué direcciones ha elegido cada usuario. A través de la 
dirección
puedes sacar la fuente.

Así que yo creo que te bastaría con un modelo Eleccion que relaciona a 
los
usuarios con las direcciones elegidas. Por ejemplo:

class Eleccion < ActiveRecord::Base
  belongs_to :user
  belongs_to :direccion
end

etc...

Aunque como sugiere Manuel en su respuesta siguiente, esto puede 
equivaler a
un modelo intermedio con has_many :through...


> y la pregunta es, la tabla esa donde se guarda lo que elegio el usuario
> debe estar asociada al modelo fuente-1--- *-direccion ??? como??
>
> yo lo he estado pensando y se que queda algo como
>
> fuente-1---*-direccion -*---1-agregadorRSS
>
> pero claro ya esto es muchos a muchos y entonces no puedo guardar la
> relacion entre direccion y fuente como en el 1 a muchos
>

Sobre todo creo que tienes que tener claro que te puedes olvidar de
almacenar la fuente, ya que eso ya lo tienes controlado desde la propia
relación entre fuente y dirección. Lo que necesitas es sólo una tabla
intermedia entre usuarios y direcciones, con un modelo intermedio 
llamado
Eleccion, Suscripcion, o como veas...


>
> espero qu me aclaren un poco, a lo mejor yo lo estoy haciendo mas
> complicado de lo que es.
>

Un poquito :) Si no te aclaras con estas explicaciones lo miramos en más
detalle...
Posted by Maite Piedra (maite)
on 13.08.2008 11:12
hola chicos he pensado en la solucion que me han dado y nose si 
funcionara
la relacion fuente-1--- *-direccion solo la va a tocar el administrador 
de la página

el va a a poner nuevas fuentes y va a poner direcciones pertenecientes a 
esa fuente, luego las va a listar y va a elegir  sera algo como

fuente 1
  direccion 1
  direccion 2

fuente 2
  direccion 1
  direccion 2

etc...

las direcciones que el marque serán guardadas en una tabla (que es la 
que nose relacionar con el modelo que ya tengo)

por último para mostrar las noticias en la web, solo tendre que leer 
esta tabla(la que nose hacer)

asi a groso modo he implementado esto, pero aun no lo he probado
no he puesto a los usuario en la relacion, es que no entiendo porque 
debe ir

-tablas-

table direccions
t.string :categoria
t.text :descripcion

table fuentes
t.string :nombre
t.text :descripcion

table recursos
t.integer :direccion_id
t.integer :fuente_id

-modelos-

class recurso
belongs_to :direccion
belongs_to :fuente

class fuente
has_many :recursos
has_many :direccions, :thought => :recursos

class direccion
has_many :recursos
has_many :fuentes, :thought => :recursos

esto creo que no me funciona, ya que fuente_id desaparece de la tabla 
direccions y ya no puedo guardar la relación entre fuente y direccion.

alguna idea???
muchas gracias
Posted by Manuel González Noriega (Guest)
on 13.08.2008 11:23
(Received via mailing list)
2008/8/13 Maite Piedra <ruby-forum-incoming@andreas-s.net>:
> has_many :recursos
> has_many :fuentes, :thought => :recursos
>
> esto creo que no me funciona, ya que fuente_id desaparece de la tabla
> direccions y ya no puedo guardar la relación entre fuente y direccion.
>
> alguna idea???

Hola Maite,

1) Tienes un error de sintaxis al escribir "thought" (pensamiento) en
vez de "through" (a través de)

2) *Sí* tienes relacionado fuente y recurso por medio de un has_many
:through pero si no entiendes por qué me temo que lo que te toca es
repasar la documentación hasta que entiendas qué es y en qué consiste
esta relación. Hay muchos tutoriales en la red y explicaciones en
cualquiera de los principales libros publicados sobre Rails.  Con
lagunas tan grandes no podrás hacer nada fuera de lo muy básico.



--
Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.