Ruby on Rails
Asociaciones ActiveRecord
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