ruby on rails - many - Rails has_one: a través de la asociación
rails foreign key (3)
Lógica , puede que parezca un poco débil para esto, pero sería lógico decir que "tengo un proveedor que tiene una cuenta conmigo, quiero ver el historial completo de la cuenta de este proveedor", por lo que tiene sentido para mí. Para poder acceder al historial de cuenta directamente desde el proveedor.
Eficiencia , esto es para mí la razón principal por la que lo usaría
:through
, simplemente porque esto emite una declaración de unión en lugar de llamar al proveedor, y luego a la cuenta, y luego a account_history. notado el número de llamadas de base de datos?usando
:through
, 1 llamada para obtener el proveedor, 1 llamada para obtener account_history (Rails usa automáticamente:join
para recuperar a través de la cuenta)usando la asociación normal, 1 llamada para obtener el proveedor, 1 llamada para obtener la cuenta y 1 llamada para obtener la cuenta_historia
Eso es lo que pienso =) ¡Espero que ayude!
Rails tiene un has_one :through
asociación que ayuda a configurar una asociación uno a uno con un tercer modelo al pasar por un segundo modelo. ¿Cuál es el uso real de eso, además de hacer una asociación de acceso directo, que de otra manera sería un paso adicional.
Tomando este ejemplo de la guide Rails:
class Supplier < ActiveRecord::Base
has_one :account
has_one :account_history, :through => :account
end
class Account < ActiveRecord::Base
belongs_to :supplier
has_one :account_history
end
class AccountHistory < ActiveRecord::Base
belongs_to :account
end
podría permitirnos hacer algo como:
supplier.account_history
que de otro modo se alcanzaría como:
supplier.account.history
Si es solo para un acceso más simple, técnicamente podría haber una asociación de uno a uno que conecte un modelo con un modelo nth pasando por los modelos n-1 para un acceso más fácil. ¿Hay algo más que me esté perdiendo además del atajo?
Me sorprende que nadie haya tocado en los objetos de asociación .
A has_many
(o has_one
) :through
relación facilita el uso del patrón de objeto de asociación que es cuando tiene dos cosas relacionadas entre sí, y esa relación en sí misma tiene atributos (es decir, una fecha en que se realizó la asociación o cuando expira).
Algunos consideran que esto es una buena alternativa al ayudante has_and_belongs_to_many
ActiveRecord. El razonamiento detrás de esto es que es muy probable que necesite cambiar la naturaleza de la asociación o agregar algo más, y cuando lleva un par de meses en un proyecto, esto puede ser muy doloroso si la relación se estableció inicialmente como a has_and_belongs_to_many
(el segundo enlace has_and_belongs_to_many
algunos detalles). Si se configura inicialmente utilizando has_many :through
relación, luego de un par de meses en el proyecto, es fácil cambiar el nombre del modelo de unión o agregarle atributos, lo que facilita que los desarrolladores respondan a los requisitos cambiantes. Plan de cambio.
Asociación inversa : considere la situación clásica usuario-membresía-grupo. Si un usuario puede ser miembro de muchos grupos, entonces un grupo tiene muchos miembros o usuarios, y un usuario tiene muchos grupos. Pero si el usuario solo puede ser miembro de un grupo, el grupo todavía tiene muchos miembros:
class User has_one :group, :through => :membership
peroclass Group has_many :members, :through => memberships
. Lamembership
modelo intermedio es útil para realizar un seguimiento de la relación inversa.Capacidad de
has_one :through
: unhas_one :through
relación se puede expandir y extender fácilmente a unhas_many :through
relación