¿Cuál es la diferencia entre belongs_to y has_one?

¿Cuál es la diferencia entre un belongs_to y un has_one ?

Leer la guía de Ruby on Rails no me ha ayudado.

Básicamente hacen lo mismo, la única diferencia es en qué lado de la relación estás. Si un User tiene un Profile , en la clase de User tendría has_one :profile y en la clase de Profile tendría belongs_to :user . Para determinar quién “tiene” el otro objeto, mira dónde está la clave externa. Podemos decir que un User “tiene” un Profile porque la tabla de profiles tiene una columna user_id . Sin embargo, si hubiera una columna llamada profile_id en la tabla de users , diríamos que un Profile tiene un User y las ubicaciones belongs_to / has_one se intercambiarían.

aquí hay una explicación más detallada.

Se trata de dónde se encuentra la clave externa.

 class Foo < AR:Base end 
  • Si foo belongs_to :bar , la tabla de foos tiene una columna bar_id
  • Si foo has_one :bar , la tabla de barras tiene una columna foo_id

En el nivel conceptual, si su class A tiene una relación has_one con la class B entonces la class A es la progenitora de la class B tanto, su class B tendrá una relación belongs_to con la class A ya que es hija de la class 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 relación belongs_to .

 class User < ActiveRecord::Base # I reference an account. belongs_to :account end class Account < ActiveRecord::Base # One user references me. has_one :user end 

Las tablas para estas clases podrían verse más o menos así:

 CREATE TABLE users ( id int(11) NOT NULL auto_increment, account_id int(11) default NULL, name varchar default NULL, PRIMARY KEY (id) ) CREATE TABLE accounts ( id int(11) NOT NULL auto_increment, name varchar default NULL, PRIMARY KEY (id) ) 

has_one y belongs_to generalmente son iguales en un sentido que apuntan al otro modelo relacionado. belongs_to asegúrese de que este modelo tenga la foreign_key definida. has_one se asegura de que el otro modelo has_foreign definida la clave has_foreign .

Para ser más específico, hay dos lados de la relationship , uno es el Owner y el otro es Belongings . Si solo se ha definido has_one , podemos obtener sus Belongings pero no podemos sacar al Owner de sus belongings . Para rastrear al Owner , necesitamos definir el belongs_to también en el modelo de pertenencia.

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,

 @books = @author.books 

Pero para un libro en particular no podemos obtener el autor correspondiente,

 @author = @book.author 

para hacer que el código anterior funcione, necesitamos agregar asociación al modelo de Libro también, como este

 class Book < ApplicationRecord belongs_to :author end 

Esto agregará el método 'autor' al modelo de Libro.
Para detalles del modo, vea las guías