Pregunta

Esta pregunta ya tiene una respuesta aquí:

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?

¿Fue útil?

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top