ruby-on-rails - inverse_of - rails references
Diferencia entre has_one y belongs_to en Rails? (3)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cuál es la diferencia entre belongs_to y has_one? 3 respuestas
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.