references rails inverse_of has_many has_and_belongs_to_many foreign belong association ruby-on-rails ruby has-one

ruby-on-rails - inverse_of - rails references



Diferencia entre has_one y belongs_to en Rails? (3)

Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de entender has_one relationship en RoR.

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 usar has_one :person lugar de belongs_to :person en Cell model?

¿No es lo mismo?


El uso de ambos le permite obtener información de los modelos Persona y Celda.

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


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

belongs_to significa que la clave foránea está en la tabla para esta clase. Así que belongs_to SÓLO puede entrar en la clase que contiene la clave foránea.

has_one significa que hay una clave externa en otra tabla que hace referencia a esta clase. Así que has_one SÓLO puede entrar en una clase a la que hace referencia una columna en otra tabla.

Entonces esto está mal:

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

Asi es esto:

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, necesita una de cada, y tienen que ir en la clase correcta. Incluso para una asociación unidireccional, importa cuál uses.


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 las celdas).

Para resumir: no agregue "belongs_to" a menos que necesite asociaciones bidireccionales entre modelos.