through rails many how has_and_belongs_to_many has foreign example create belongs and active ruby-on-rails associations rails-activerecord rails-models

ruby on rails - many - Rails has_one: a través de la asociación



rails foreign key (3)

  1. 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.

  2. 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 pero class Group has_many :members, :through => memberships . La membership modelo intermedio es útil para realizar un seguimiento de la relación inversa.

  • Capacidad de has_one :through : un has_one :through relación se puede expandir y extender fácilmente a un has_many :through relación