¿Cuál es la diferencia entre un belongs_to
y un has_one
?¿Cuál es la diferencia entre belongs_to y has_one?
Leer la guía de Ruby on Rails no me ha ayudado.
¿Cuál es la diferencia entre un belongs_to
y un has_one
?¿Cuál es la diferencia entre belongs_to y 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 se encuentra. Si un User
tiene un Profile
, entonces en la clase User
tendría has_one :profile
y en la clase 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 profiles
tiene una columna user_id
. Si hubiera una columna llamada profile_id
en la tabla users
, sin embargo, diríamos que un Profile
tiene un User
, y las ubicaciones belongs_to/has_one se intercambiarían.
here es una explicación más detallada.
ok tiene sentido, has_a es propiedad, mientras que un belongs es más una relación. – Blankman
buen blog [en este] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/). –
Así que para decirlo realmente corto: 'Product belongs_to Shop' significa que la tabla' products' tiene 'shop_id' column –
Se trata de dónde se encuentra la clave externa.
class Foo < AR:Base
end
belongs_to :bar
, entonces la tabla Foos tiene una columna bar_id
has_one :bar
, entonces la tabla barras tiene una columna foo_id
En el plano conceptual, si su class A
tiene una relación has_one
con class B
luego class A
es el padre de class B
por lo tanto, su class B
tendrá una relación belongs_to
con class A
ya que es el hijo de class A
.
Ambos expresan una relación de 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 ser algo como:
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)
)
. Es casi la misma respuesta aceptada hace dos años. –
Esta es una mejor respuesta. – typeoneerror
has_one
y belongs_to
generalmente son los mismos en un sentido que apuntan a otro modelo relacionado. belongs_to
asegúrese de que este modelo tenga definido el foreign_key
. has_one
se asegura de que se haya definido la otra clave del modelo has_foreign
.
Para ser más específicos, hay dos lados de relationship
, uno es el Owner
y el otro es Belongings
. Si solo se define has_one
, podemos obtener su Belongings
pero no puede obtener el Owner
del belongings
. Para rastrear el Owner
necesitamos definir el belongs_to
también en el modelo de pertenencia.
Una cosa adicional que quiero añadir es, supongamos que tenemos después de haber pertenecido modelos
class Author < ApplicationRecord has_many :books end
si sólo escribimos la asociación anterior, entonces podemos obtener todos los libros de un autor determinado por,
@books = @author.books
Pero para un libro en particular que no podemos conseguir el autor correspondiente por,
@author = @book.author
para hacer el trabajo por encima de código funcione tenemos que añadir a la asociación modelo de libro también, como este
class Book < ApplicationRecord
belongs_to :author
end
Esto agregará método de 'autor' de modelo de libro.
Para detalles del modo, vea guides
posible duplicado de [¿Diferencia entre has \ _one y pertenece \ _to en Rails?] (Http://stackoverflow.com/questions/861144/difference-between-has-one-and-belongs -to-in-rails) – Nakilon