2009-09-04 9 views
1

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 a une seule description. Donc comme optimisation, Je pensais que chaque TypeDescription devait être jointe avec Type via JOIN en sql, donc j'ai utilisé default_scope et defined join, et cela fonctionne quand je reçois un type via Type.find (id), mais quand j'utilise user = User. find (1), chaque type de user.types n'a pas de données de TypeDescription, car default_scope ajoute simplement des options définies à des méthodes comme find, all etc. Donc ce que je cherche est une solution pour que cela fonctionne dans ma situation, Donc, ce que je veux, c'est quand 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.Rails, has_many et joint

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!

Répondre

1

Depuis rails 2.1, le « include » a changé pour générer plusieurs requêtes au lieu de simplement une requête. La raison en est que pour une grande table, une jointure peut produire beaucoup de lignes dupliquées, ce qui place les frais généraux sur les rails.

voici un bon article pour trouver plus d'informations. Dans votre cas particulier, si vous voulez toujours "include" pour effectuer "join", l'article mentionne qu'il existe une option de filtrage mais je ne peux pas le trouver moi-même.

de toute façon, amikazmi est juste, la performance sage, il n'a probablement pas d'importance pour le moment.

1

si vous voulez avoir le TypeDescription avec le type, vous devez utiliser : inclure, non : Relie

+0

mais c'est plus rapide si je joignais TypeDescription à chaque type, dans les deux cas, il y a deux requêtes, mais rejoindre est plus rapide que deux requêtes ... – mfolnovich

+0

alors, ce que je veux, c'est générer deux requêtes. find (1,: include => [: types]) SELECT * FROM utilisateurs WHERE id = 1; SELECT * FROM types types JOIN type_descriptions ON types.id = type_descriptions.id O WH 'id' IN (1, 3, 5); – mfolnovich

+0

vous faites User.find (1,: include => {: types =>: type_descriptions}) cela va générer 3 requêtes, et c'est ok ... tout ce que vous voulez faire est d'optimiser les requêtes N + 1 à 3 , 3 est assez bas :) – amitkaz