1 votes

Rails, has_many et joins

J'ai trois modèles, User, Type et TypeDescription, et comme vous pouvez le voir ci-dessous, chaque utilisateur peut avoir plusieurs types, mais chaque type n'a qu'une seule description. Donc comme optimisation, J'ai pensé que chaque TypeDescription devrait être jointe au Type via JOIN dans sql, donc j'ai utilisé default_scope et defined join, et cela fonctionne quand j'obtiens le type via Type.find( id ), mais quand j'utilise user = User.find( 1 ), chaque type dans user.types n'a pas de données de TypeDescription, parce que default_scope ajoute juste des options définies aux méthodes comme find, all etc. Donc, ce que je cherche, c'est une solution pour que cela fonctionne dans ma situation. Ce que je veux, c'est que lorsque j'obtiens certains ou tous les utilisateurs, je veux avoir tous les types d'utilisateurs et chaque type devrait avoir des données de TypeDescription.

donc, le code est :

class User
  has_many :types
end

class Type
  has_one :type_description

  default_scope :joins => :type_description
end

class TypeDescription
  belongs_to :type
end

Merci !

1voto

amitkaz Points 2063

Si vous souhaitez que la description du type soit associée au type, vous devez utiliser la fonction :inclure pas :joins

1voto

ez. Points 3836

Depuis la version 2.1 de rails, la fonction "include" a été modifiée pour générer plusieurs requêtes au lieu d'une seule. La raison en est que pour les grandes tables, une jointure peut produire beaucoup de lignes dupliquées, ce qui entraîne une surcharge pour les rails.

voici un bon article pour trouver plus d'informations. Dans votre situation "one-to-one", si vous voulez toujours que "include" exécute "join", l'article mentionne qu'il existe une option de filtrage mais je ne la trouve pas moi-même.

de toute façon, amikazmi a raison, en ce qui concerne les performances, cela n'a probablement pas d'importance pour le moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X