Buscar..


pertenece a

A belongs_to asociación establece una conexión de uno a uno con otro modelo, por lo que cada instancia del modelo declarando "pertenece a" una instancia del otro modelo.

Por ejemplo, si su aplicación incluye usuarios y publicaciones, y cada publicación puede asignarse a exactamente un usuario, declararía el modelo de publicación de esta manera:

class Post < ApplicationRecord
  belongs_to :user
end

En la estructura de tu tabla, puedes tener

create_table "posts", force: :cascade do |t|
  t.integer  "user_id",  limit: 4
end

Tiene uno

Una asociación has_one establece una conexión uno a uno con otro modelo, pero con una semántica diferente. Esta asociación indica que cada instancia de un modelo contiene o posee una instancia de otro modelo.

Por ejemplo, si cada usuario en su aplicación tiene solo una cuenta, declararía el modelo de usuario así:

class User < ApplicationRecord
  has_one :account
end

En Registro activo, cuando tiene una relación has_one , el registro activo garantiza que solo exista un registro con la clave externa.

Aquí en nuestro ejemplo: En la tabla de cuentas, solo puede haber un registro con un user_id particular. Si intenta asociar una cuenta más para el mismo usuario, hace que la clave externa de la entrada anterior sea nula (quedando huérfana) y crea una nueva automáticamente. Hace que la entrada anterior sea nula, incluso si el guardado falla para que la nueva entrada mantenga la coherencia.

user = User.first
user.build_account(name: "sample")
user.save   [Saves it successfully, and creates an entry in accounts table with user_id 1]
user.build_account(name: "sample1")  [automatically makes the previous entry's foreign key null]
user.save  [creates the new account with name sample 1 and user_id 1]

tiene muchos

Una asociación has_many indica una conexión de uno a varios con otro modelo. Esta asociación generalmente se encuentra en el otro lado de una asociación deredes a.

Esta asociación indica que cada instancia del modelo tiene cero o más instancias de otro modelo.

Por ejemplo, en una aplicación que contiene usuarios y publicaciones, el modelo de usuario podría declararse así:

class User < ApplicationRecord
  has_many :posts
end

La estructura de la tabla de Post seguiría siendo el mismo que en el belongs_to ejemplo; en contraste, el User no requeriría ningún cambio de esquema.

Si desea obtener la lista de todas las publicaciones publicadas para el User , puede agregar lo siguiente (es decir, puede agregar ámbitos a sus objetos de asociación):

class User < ApplicationRecord
  has_many :published_posts, -> { where("posts.published IS TRUE") }, class_name: "Post"
end

Asociación polimórfica

Este tipo de asociación permite que un modelo ActiveRecord pertenezca a más de un tipo de registro modelo. Ejemplo común:

class Human < ActiveRecord::Base
  has_one :address, :as => :addressable
end

class Company < ActiveRecord::Base
  has_one :address, :as => :addressable
end

class Address < ActiveRecord::Base
  belongs_to :addressable, :polymorphic => true
end

Sin esta asociación, tendría todas estas claves externas en su tabla de direcciones, pero solo tendría un valor para una de ellas porque una dirección, en este escenario, solo puede pertenecer a una entidad (humana o empresa). Aquí es como se vería:

class Address < ActiveRecord::Base
  belongs_to :human
  belongs_to :company
end

El has_many: a través de la asociación

A has_many :through asociación se utiliza a menudo para configurar una conexión de many-to-many con otro modelo. Esta asociación indica que el modelo declarante puede compararse con cero o más instancias de otro modelo al proceder a través de un tercer modelo.

Por ejemplo, considere una práctica médica donde los pacientes hacen citas para ver a los médicos. Las declaraciones de asociación relevantes podrían verse así:

class Physician < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ApplicationRecord
  belongs_to :physician
  belongs_to :patient
end

class Patient < ApplicationRecord
  has_many :appointments
  has_many :physicians, through: :appointments
end

El has_one: a través de la asociación.

A has_one :through asociación configura one-to-one conexión one-to-one con otro modelo. Esta asociación indica que el modelo declarante se puede hacer coincidir con una instancia de otro modelo al proceder a través de un tercer modelo.

Por ejemplo, si cada supplier tiene una account y cada cuenta está asociada con un historial de cuenta, entonces el modelo de proveedor podría tener este aspecto:

class Supplier < ApplicationRecord
  has_one :account
  has_one :account_history, through: :account
end

class Account < ApplicationRecord
  belongs_to :supplier
  has_one :account_history
end

class AccountHistory < ApplicationRecord
  belongs_to :account
end

La asociación has_and_belongs_to_many

Una asociación has_and_belongs_to_many crea una conexión directa de many-to-many con otro modelo, sin un modelo intermedio.

Por ejemplo, si su aplicación incluye assemblies y parts , cada ensamblaje tiene muchas piezas y cada pieza aparece en muchos ensamblajes, podría declarar los modelos de esta manera:

class Assembly < ApplicationRecord
  has_and_belongs_to_many :parts
end

class Part < ApplicationRecord
  has_and_belongs_to_many :assemblies
end

Asociación auto-referencial

La asociación autorreferencial se utiliza para asociar un modelo consigo mismo. El ejemplo más frecuente sería administrar la asociación entre un amigo y su seguidor.

ex.

rails g model friendship user_id:references friend_id:integer

ahora puedes asociar modelos como;

class User < ActiveRecord::Base
  has_many :friendships
  has_many :friends, :through => :friendships
  has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
  has_many :inverse_friends, :through => :inverse_friendships, :source => :user
end

y el otro modelo se verá como

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User"
end


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow