Diferencia entre has_one y belongs_to en Rails?[duplicar]
-
21-08-2019 - |
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- ¿Cuál es la diferencia entre belongs_to y has_one? 4 respuestas
Estoy tratando de entender has_one
relación 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
en lugar de belongs_to :person
en Cell
modelo?
No es el mismo?
Solución
No, no son intercambiables, y hay algunas diferencias reales.
belongs_to
significa que la clave externa está en la tabla para esta clase. Así has_one
puede ir sólo en la clase que posee la clave externa.
Cell
significa que hay una clave externa de otra tabla que hace referencia a esta clase. Así person_id
sólo puede ir en una clase que se hace referencia por una columna de otra tabla.
Así que esto es un error:
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
Y esto también es erróneo:
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
La forma correcta es (si <=> contiene <=> campo):
class Person < ActiveRecord::Base
has_one :cell # the person table does not have 'joining' info
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 de un solo sentido, es importante que se utilice.
Otros consejos
Si se agrega "belongs_to", entonces usted tiene una asociación bidireccional. Esto significa que puede obtener una persona de la célula y una célula de la persona.
No hay ninguna diferencia real, ambos enfoques (con y sin "belongs_to") utiliza el mismo esquema de base de datos (un campo person_id en la tabla de base de datos de las células).
Para resumir:. No agregue "belongs_to" a menos que necesite asociaciones bidireccionales entre los modelos
El uso de ambos le permite obtener información de ambos modelos celulares y persona.
@cell.person.whatever_info and @person.cell.whatever_info.