Pregunta

Rails tiene una asociación has_one :through que ayuda a establecer una asociación de uno a uno con un tercer modelo pasando a través de un segundo modelo. ¿Cuál es el uso real de que además de hacer una asociación de acceso directo, que de otro modo sería un paso adicional de distancia.

Tomando este ejemplo de los rieles guía :

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 alcanzó como:

supplier.account.history

Si es sólo para el acceso más sencillo a continuación, técnicamente no puede haber una asociación uno-a-uno que se conecta un modelo con algún modelo enésimo pasando por n-1 modelos para facilitar el acceso. ¿Hay algo más a ella que me falta además el acceso directo?

¿Fue útil?

Solución

  1. Lógica , bien puede ser que suene un poco débil para esto, pero sería lógico decir que "tengo un proveedor que tenga una cuenta conmigo, yo quiero ver la totalidad historial de la cuenta de este proveedor", así que tiene sentido para mí ser capaz de historial de la cuenta de acceso de proveedor directamente.

  2. Eficiencia , esto para mí es la razón principal por la que usaría :through, simplemente porque estos temas una instrucción de combinación en lugar de llamar proveedor, y luego la cuenta, y luego account_history. notado la cantidad de llamadas de base de datos?

    • usando :through, 1 llamada para obtener el proveedor, 1 llamada para obtener account_history (carriles utiliza automáticamente :join para recuperar través de la cuenta)

    • mediante asociación normal, 1 llamada para obtener proveedor, 1 llamada para obtener cuenta, y 1 llamada para obtener account_history

Eso es lo que pienso =) espero que ayude!

Otros consejos

Me sorprende que nadie ha tocado Asociación Objetos .

A has_many (o has_one) relación :through facilita el uso de la objeto de asociación patrón que es cuando se tienen dos cosas relacionadas entre sí, y que relación misma tiene atributos (es decir, una fecha en que se hizo la asociación o cuando expira).

Este es considerado por algunos a ser una buena alternativa a la has_and_belongs_to_many ActiveRecord ayudante. El razonamiento detrás de esto es que es muy probable que usted tendrá que cambiar la naturaleza de la asociación o agregar a ella, y cuando estás un par de meses en un proyecto, esto puede ser muy doloroso si la relación se estableció inicialmente como un has_and_belongs_to_many (el segundo enlace entra en algunos detalles). Si se ha configurado inicialmente utilizando una relación has_many :through, a continuación, un par de meses de ejecución es fácil cambiar el nombre de la unión de modelo o añadir atributos a la misma, por lo que es más fácil para los desarrolladores para responder a las necesidades cambiantes. Plan para el cambio.

  • Asociación inversa en cuenta la facilidad de uso de miembros del grupo situación clásica. Si un usuario puede ser miembro de muchos grupos, a continuación, un grupo tiene muchos miembros o usuarios, y un usuario tiene muchos grupos. Pero si el usuario sólo puede ser miembro de un grupo, el grupo todavía tiene muchos miembros: class User has_one :group, :through => :membership pero class Group has_many :members, :through => memberships. El modelo membership intermedio es útil para realizar un seguimiento de la relación inversa.

  • Capacidad de expansión : una relación has_one :through fácil se puede ampliar y se extendió a una relación has_many :through

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top