references rails inverse_of has_many has_and_belongs_to_many foreign belong association ruby-on-rails activerecord

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 columna bar_id
  • Si foo has_one :bar , la tabla de barras tiene una columna foo_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.