2013-06-13 6 views
0

MISE À JOUR: Voici comment nous l'avons réglé. run MYSQL Expliquer sur le sql généré par les deux extraits de code:Rails Association, Scope, JoinModel

Manifest.where (assembly_id => @ assembly.id) .Qu'est-ce que (part_id => @ part.id) .exists? NO JOINS ET RAN PLUS RAPIDE - DONC GAGNÉ!

je la situation suivante:

class Assembly < ActiveRecord::Base 
    has_many :manifests 
    has_many :parts, :through => :manifests 
end 

class Manifest < ActiveRecord::Base 
belongs_to :assembly 
belongs_to :part 
end 

class Part < ActiveRecord::Base 
has_many :manifests 
has_many :assemblies, :through => :manifests 

fin

Alors, comme les geeks font mes collègues et je suis entré dans un argument controversé sur les points suivants:

Compte tenu d'une part et un ensemble trouvez s'ils sont sur le même manifeste.

d'une solution (à l'aide des associations):

@part.assemblies.include? @assembly 

Solution deux (Portées à l'aide):

Manifest.where(assembly_id => @assembly.id).where(part_id => @part.id).exists? 

Solution un fait une jointure interne pour obtenir les données et il a conduit le camp qui hait enjambant tables noix. Mais c'est laconique et pas moche.

La solution deux ne fait pas de jointure interne et utilise des étendues (c'est-à-dire les clauses where), mais c'est un peu moche.

La première solution est appelée inefficace et lorsqu'elle est profilée, elle tourne en fait un peu plus lentement.

Toute réflexion sur les meilleures pratiques pour cette situation. Btw, j'ai attrapé le code à partir des guides Rails afin d'illustrer le problème.

+0

'@ part.assemblies.find (@ assembly.id)' –

Répondre

0

je le ferais l'une des 2 façons suivantes, non pour des raisons de performance, juste pour la clarté de l'expression:

Y a-t-il des manifestes appartenant à @assembly et @part?

Manifest.where(assembly_id: @assembly.id, part_id: @part.id).any? 

Ou, est-ce que @assembly et @part partagent des manifestes?

(@assembly.manifests & @part.manifests).any? 
+0

grâce @AJcodez. Mais à la fin j'essaie de minimiser l'impact que la requête sql aura sur ma base de données. – RidingRails