ruby-on-rails - inverse_of - rails references
¿Cuál es la diferencia entre belongs_to y has_one? (4)
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.
here hay una explicación más detallada.
¿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.
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 columnabar_id
- Si foo
has_one :bar
, la tabla de barras tiene una columnafoo_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)
)
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 guides
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.