Rails has_one :grâce à l'association
Rails a un has_one :through
association qui aide à mettre en place un one-to-one d'association avec un troisième modèle en passant par un deuxième modèle. Qu'est-ce que l'utilisation réelle de ce en outre de faire un raccourci de l'association, qui serait par ailleurs une étape supplémentaire à l'écart.
En prenant cet exemple dans le cas des Rails guide:
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
puisse nous permettre de faire quelque chose comme:
supplier.account_history
qui autrement serait atteint que:
supplier.account.history
Si c'est seulement pour un accès plus simple alors, techniquement, il pourrait être un one-to-one de l'association qui se connecte à un modèle avec certains énième modèle à n-1 modèles pour faciliter l'accès. Est-il rien d'autre à lui qui me manque d'ailleurs le raccourci?
Vous devez vous connecter pour publier un commentaire.
Logique, OK ça peut paraître un peu faible, mais il serait logique de dire que "j'ai un fournisseur qui a un compte avec moi, je veux voir l'intégralité du compte de l'histoire de ce fournisseur", il est donc logique pour moi d'être en mesure d'accéder à l'historique du compte du fournisseur directement.
Efficacité, c'est pour moi la principale raison je utiliser
:through
, tout simplement parce que ce questions de un join, plutôt que d'appeler le fournisseur, puis sur compte, puis account_history. remarqué le nombre d'appels de base de données?à l'aide de
:through
, 1 appel pour obtenir le fournisseur, 1 appel pour obtenir account_history (rails utilise automatiquement:join
à récupérer par le biais du compte)l'utilisation normale de l'association, 1 appel pour obtenir fournisseur, 1 appel pour obtenir un compte, et 1 appel pour obtenir des account_history
C'est ce que je pense =) j'espère que ça aide!
has_one :through
est beaucoup plus propre pour l'exécution d'opérations sur tertiaires de données relationnelles, de l'injection ou de l'instanciation de la structure tertiaire de la classe dans l'appel de la classe.Je suis surpris que personne n'a touché sur Association des Objets.
Un
has_many
(ouhas_one
):through
relation facilite l'utilisation de l' l'association de l'objet modèle qui est quand vous avez deux choses sont liées les unes aux autres, et que la relation elle-même est attributs (c'est à dire la date à laquelle l'association a été faite ou à l'échéance).C'est considéré par certains être une bonne alternative à la
has_and_belongs_to_many
ActiveRecord helper. Le raisonnement derrière cela est qu'il est très probable que vous aurez besoin de changer la nature de l'association ou d'y ajouter, et quand vous êtes un couple de mois dans un projet, cela peut être très douloureux si la relation ont été initialement mis en place comme unhas_and_belongs_to_many
(le deuxième lien dans le détail). Si elle est configurée à l'aide d'unehas_many :through
relation, puis un couple de mois dans le projet, il est facile de renommer le rejoindre modèle ou d'ajouter des attributs à, rendre plus facile pour les développeurs de répondre à l'évolution des besoins. Plan pour le changement.Association Inverse: examiner la situation classique de l'utilisateur-l'appartenance de groupe. Si un utilisateur peut être membre de plusieurs groupes, puis un groupe a plusieurs membres ou utilisateurs, et qu'un utilisateur a de nombreux groupes. Mais si l'utilisateur ne peut être un membre dans un groupe, le groupe a encore de nombreux membres:
class User has_one :group, :through => :membership
maisclass Group has_many :members, :through => memberships
. Le modèle intermédiairemembership
est utile pour garder la trace de la relation inverse.Évolutivité: un
has_one :through
relation peut facilement être élargi et étendu à unhas_many :through
relation