Relacion 1 a 1 entre dos tablas


#1

Hola, estaba siguiendo el post “relación circular de una entidad” y
he visto que le recomiendan cambiar la relación a has_one (1 a 1
entre dos tablas)

Me he puesto a googlear ya que estaba probando una relación de ese
tipo y creo que estoy metiendo la pata :stuck_out_tongue:
Por lo que he encontrado en google me he fijado que solo pasan un id,
por ejemplo:

  • personas (1 a 1 con) - telefonos
    id id
    … persona_id
    … …

entonces según lo leído en google seria algo como
class Persona < ActiveRecord::Base
has_one :telefono
end

class Telefono < ActiveRecord::Base
belongs_to :persona
end

¿es esto correcto???

Yo siempre creí que en una relación 1 a 1 se intercambian ambas
tablas las claves quedando el ejemplo anterior así

  • personas (1 a 1 con) - telefonos
    id id
    telefono_id persona_id
    … …

y luego
class Persona < ActiveRecord::Base
has_one :telefono
belongs_to :telefono
end

class Telefono < ActiveRecord::Base
has_one :persona
belongs_to :persona
end

Alguien me puede orientar? muchas gracias por la ayuda.
Un saludo.


#2

Hola
Le recomiendo cambiar a una relación 1:1 por el código que tenia en la
vista, solo buscaba 1 resultado, por lo que le convenía usar has_one.

Con respecto a lo de las relaciones que planteas, no estás metiendo la
pata,
lo que pasa es que la forma de definir las relaciones en Rails es a
veces un
poco distinta a como lo harías si trabajas con SQL directamente.

has_one, has_many, belongs_to, etc, no solo definen la relación entre
los
objetos(tablas) sino que agregan algunos métodos a ellos dependiendo del
tipos de ralación, que a su ves generan los comandos sql para traer y
llevar
los datos.

Por esta razón Rails define que el foreign key debe ir del lado que
tiene el
belongs_to para que la relación entre los objetos se arme correctamente,
recuerda también el tema de los plurales que a muchos puristas de sql
les
molesta mucho :

Persona HAS_ONE trabajo
persona.trabajo.descripcion

Persona HAS_MANY amigos
persona.amigos.count

espero se entienda :wink:

Saludos
Hernán


#3

muchas gracias por la explicación, muy agradecido.

Un saludo.