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.
'@ part.assemblies.find (@ assembly.id)' –