¿Cuál es la diferencia entre a belongs_toy 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
Usertiene unProfile, entonces en laUserclase que tendríahas_one :profiley en laProfileclase 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" aProfileporque laprofilestabla tiene unauser_idcolumna. Sin embargo, si se llamaraprofile_ida una columna en lauserstabla, diríamos que aProfiletiene unUser, y las ubicaciones belong_to / has_one se intercambiarían.Aquí hay una explicación más detallada.
fuente
Product belongs_to Shopsignifica que laproductstabla tiene unashop_idcolumnaSe trata de dónde se encuentra la clave externa.
belongs_to :bar, entonces la tabla foos tiene unabar_idcolumnahas_one :bar, entonces la tabla de barras tiene unafoo_idcolumnaEn el nivel conceptual, si
class Atiene unahas_onerelación con,class Bentoncesclass Aes el padre de, por loclass Btantoclass B, tendrá unabelongs_torelació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_torelación.Las tablas para estas clases podrían verse así:
fuente
AccountyUseren este ejemplo es lamentable ya que a menudo es el caso de que una cuenta puede tener muchos usuarios.has_oneybelongs_togeneralmente son iguales en un sentido que apuntan al otro modelo relacionado.belongs_toasegúrese de que este modelo tenga elforeign_keydefinido.has_onese asegura de que el otro modelohas_foreignclave del definida.Para ser más específicos, hay dos lados de
relationship, uno es elOwnery otro esBelongings. Si solohas_onese define, podemos obtener suBelongingspero no podemos obtener elOwnerdebelongings. Para rastrearOwnernecesitamos definir elbelongs_totambié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 endsi 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_toes mejor quehas_oneporque enhas_one, tendría que agregar las siguientes restricciones al modelo y la tabla que tiene la clave externa para hacer cumplir lahas_onerelación:validates :foreign_key, presence: true, uniqueness: truefuente