¿Cuál es la diferencia entre a belongs_to
y a has_one
?
Leer la guía de Ruby on Rails no me ha ayudado.
ruby-on-rails
activerecord
Blankman
fuente
fuente
Respuestas:
Básicamente hacen lo mismo, la única diferencia es de qué lado de la relación estás. Si a
User
tiene unProfile
, entonces en laUser
clase que tendríahas_one :profile
y en laProfile
clase que tendríabelongs_to :user
. Para determinar quién "tiene" el otro objeto, observe dónde está la clave externa. Podemos decir que unUser
"tiene" aProfile
porque laprofiles
tabla tiene unauser_id
columna. Sin embargo, si se llamaraprofile_id
a una columna en lausers
tabla, diríamos que aProfile
tiene unUser
, y las ubicaciones belong_to / has_one se intercambiarían.Aquí hay una explicación más detallada.
fuente
Product belongs_to Shop
significa que laproducts
tabla tiene unashop_id
columnaSe trata de dónde se encuentra la clave externa.
belongs_to :bar
, entonces la tabla foos tiene unabar_id
columnahas_one :bar
, entonces la tabla de barras tiene unafoo_id
columnaEn el nivel conceptual, si
class A
tiene unahas_one
relación con,class B
entoncesclass A
es el padre de, por loclass B
tantoclass B
, tendrá unabelongs_to
relación conclass A
él, ya que es hijo declass A
.Ambos expresan una relación 1-1. La diferencia es principalmente dónde colocar la clave foránea, que va sobre la mesa para la clase que declara la
belongs_to
relación.Las tablas para estas clases podrían verse así:
fuente
Account
yUser
en este ejemplo es lamentable ya que a menudo es el caso de que una cuenta puede tener muchos usuarios.has_one
ybelongs_to
generalmente son iguales en un sentido que apuntan al otro modelo relacionado.belongs_to
asegúrese de que este modelo tenga elforeign_key
definido.has_one
se asegura de que el otro modelohas_foreign
clave del definida.Para ser más específicos, hay dos lados de
relationship
, uno es elOwner
y otro esBelongings
. Si solohas_one
se define, podemos obtener suBelongings
pero no podemos obtener elOwner
debelongings
. Para rastrearOwner
necesitamos definir elbelongs_to
también en el modelo de pertenencia.fuente
Una cosa adicional que quiero agregar es, supongamos que tenemos la siguiente asociación de modelos
class Author < ApplicationRecord has_many :books end
si solo escribimos la asociación anterior, podemos obtener todos los libros de un autor en particular,
Pero para un libro en particular no podemos obtener el autor correspondiente,
para que el código anterior funcione, también necesitamos agregar asociación al modelo de libro, como este
Esto agregará el método 'autor' al modelo de libro.
Para detalles del modo ver guías
fuente
Desde el punto de vista de la simplicidad,
belongs_to
es mejor quehas_one
porque enhas_one
, tendría que agregar las siguientes restricciones al modelo y la tabla que tiene la clave externa para hacer cumplir lahas_one
relación:validates :foreign_key, presence: true, uniqueness: true
fuente