更新:以下是我们如何解决它。运行MYSQL解释由两段代码生成的sql:
Manifest.where(assembly_id => @ assembly.id).where(part_id => @ part.id).exists? 没有加入和更快 - 这就是它!
我有以下情况:
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
端
所以,作为极客做我的同事,我对以下内容产生了争议:
给定一个零件和一个组件,发现它们是否在同一个清单上。
解决方案一(使用关联):
@part.assemblies.include? @assembly
解决方案二(使用范围):
Manifest.where(assembly_id => @assembly.id).where(part_id => @part.id).exists?
解决方案之一进行内部联接以获取数据,并且它驱动了讨厌跨越表格的阵营。但它简洁而不丑。
解决方案二不执行内连接并使用范围(即where子句),但它有点难看。
解决方案之一被称为效率低下,而在分析时它实际上运行速度稍慢。
对这种情况的最佳做法有任何想法。
顺便说一句,我抓住了Rails指南中的代码来说明问题。
答案 0 :(得分:0)
我会做以下两种方式之一,不是出于性能原因,只是为了清晰表达:
是否有任何清单属于@assembly和@part?
Manifest.where(assembly_id: @assembly.id, part_id: @part.id).any?
或者,@assembly和@part是否共享任何清单?
(@assembly.manifests & @part.manifests).any?