2009-05-14 18 views
57

Estoy tratando de comprender la relación has_one en RoR.Diferencia entre has_one y belongs_to en Rails?

Digamos que tengo dos modelos - Person y Cell:

class Person < ActiveRecord::Base 
    has_one :cell 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person 
end 

¿Puedo utilizar has_one :person en lugar de belongs_to :person en Cell modelo?

¿No es lo mismo?

+1

one good [blog aquí] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/) ¡por lo mismo! –

+0

El código anterior es incorrecto, debe ser 'has_one: cell' y' belongs_to: person' no debe ** no ** ser un espacio entre los dos puntos y la siguiente palabra. – Josh

Respuesta

142

No, no son intercambiables, y hay algunas diferencias reales.

belongs_to significa que la clave externa está en la tabla para esta clase. Por lo tanto, belongs_to SÓLO puede entrar en la clase que contiene la clave externa.

has_one significa que hay una clave externa en otra tabla que hace referencia a esta clase. Entonces, has_one SOLAMENTE puede entrar en una clase a la que hace referencia una columna en otra tabla.

Así que esto es falso:

class Person < ActiveRecord::Base 
    has_one :cell # the cell table has a person_id 
end 

class Cell < ActiveRecord::Base 
    has_one :person # the person table has a cell_id 
end 

Así es la siguiente:

class Person < ActiveRecord::Base 
    belongs_to :cell # the person table has a cell_id 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person # the cell table has a person_id 
end 

Para una asociación de dos vías, es necesario uno de cada uno, y tienen que ir en la clase correcta. Incluso para una asociación unidireccional, importa cuál uses.

+0

Buena respuesta. Al ver tu respuesta, me doy cuenta de que leí la mitad de la pregunta. Lo siento, pero me alegro de que haya participado. + 10 –

+5

Tuve que buscar esto mil millones de veces. Ojalá hubieran pensado un poco mejor nombrando, para dejar más claro cuál va hacia dónde. –

+18

Genial, ahora sé las dos respuestas incorrectas. Sería mejor mostrar la forma "correcta" de mostrarlo. Sólo digo'. – y0mbo

7

El uso de ambos le permite obtener información de los modelos Person y Cell.

@cell.person.whatever_info and @person.cell.whatever_info. 
10

Si agrega "belongs_to", obtendrá una asociación bidireccional. Eso significa que puede obtener una persona de la celda y una celda de la persona.

No hay diferencia real, ambos enfoques (con y sin "belongs_to") usan el mismo esquema de base de datos (un campo person_id en la tabla de la base de datos de celdas).

En resumen: no agregue "belongs_to" a menos que necesite asociaciones bidireccionales entre los modelos.

+0

La mejor frase que he leído hoy: "Si agrega" belongs_to ", obtendrá una asociación bidireccional. Eso significa que puede obtener una persona de la celda y una celda de la persona". +1 –

Cuestiones relacionadas