2010-09-28 20 views
103

¿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.

+3

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

Respuesta

161

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.

+0

ok tiene sentido, has_a es propiedad, mientras que un belongs es más una relación. – Blankman

+8

buen blog [en este] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/). –

+20

Así que para decirlo realmente corto: 'Product belongs_to Shop' significa que la tabla' products' tiene 'shop_id' column –

31

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

class Foo < AR:Base 
end 
  • Si foo belongs_to :bar, entonces la tabla Foos tiene una columna bar_id
  • Si foo 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) 
) 
+0

. Es casi la misma respuesta aceptada hace dos años. –

+7

Esta es una mejor respuesta. – typeoneerror

3

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.

0

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

Cuestiones relacionadas