ruby-on-rails - inverse_of - rails references
¿Cuál es la diferencia entre belongs_to y has_one? (4)
Básicamente hacen lo mismo, la única diferencia es en qué lado de la relación estás. Si un User tiene un Profile , en la clase de User tendría has_one :profile y en la clase de Profile tendría belongs_to :user . Para determinar quién "tiene" el otro objeto, mira dónde está la clave externa. Podemos decir que un User "tiene" un Profile porque la tabla de profiles tiene una columna user_id . Sin embargo, si hubiera una columna llamada profile_id en la tabla de users , diríamos que un Profile tiene un User y las ubicaciones belongs_to / has_one se intercambiarían.
here hay una explicación más detallada.
¿Cuál es la diferencia entre un belongs_to y un has_one ?
Leer la guía de Ruby on Rails no me ha ayudado.
Se trata de dónde se encuentra la clave externa.
class Foo < AR:Base
end
- Si foo
belongs_to :bar, la tabla de foos tiene una columnabar_id - Si foo
has_one :bar, la tabla de barras tiene una columnafoo_id
En el nivel conceptual, si su class A tiene una relación has_one con la class B entonces la class A es la progenitora de la class B tanto, su class B tendrá una relación belongs_to con la class A ya que es hija de la class A
Ambos expresan una relación 1-1. La diferencia es principalmente dónde colocar la clave foránea, que va sobre la mesa para la clase que declara la relación belongs_to .
class User < ActiveRecord::Base
# I reference an account.
belongs_to :account
end
class Account < ActiveRecord::Base
# One user references me.
has_one :user
end
Las tablas para estas clases podrían verse más o menos así:
CREATE TABLE users (
id int(11) NOT NULL auto_increment,
account_id int(11) default NULL,
name varchar default NULL,
PRIMARY KEY (id)
)
CREATE TABLE accounts (
id int(11) NOT NULL auto_increment,
name varchar default NULL,
PRIMARY KEY (id)
)
Una cosa adicional que quiero agregar es: Supongamos que tenemos la siguiente asociación de modelos
class Author < ApplicationRecord has_many :books end
si solo escribimos la asociación anterior, podemos obtener todos los libros de un autor en particular,
@books = @author.books
Pero para un libro en particular no podemos obtener el autor correspondiente,
@author = @book.author
para hacer que el código anterior funcione, necesitamos agregar asociación al modelo de Libro también, como este
class Book < ApplicationRecord
belongs_to :author
end
Esto agregará el método ''autor'' al modelo de Libro.
Para detalles del modo, vea las guides
has_one y belongs_to generalmente son iguales en un sentido que apuntan al otro modelo relacionado. belongs_to asegúrese de que este modelo tenga la foreign_key definida. has_one se asegura de que el otro modelo has_foreign definida la clave has_foreign .
Para ser más específico, hay dos lados de la relationship , uno es el Owner y el otro es Belongings . Si solo se ha definido has_one , podemos obtener sus Belongings pero no podemos sacar al Owner de sus belongings . Para rastrear al Owner , necesitamos definir el belongs_to también en el modelo de pertenencia.