Rails Association,Scope,JoinModel

时间:2013-06-13 05:41:30

标签: ruby-on-rails activerecord scopes

更新:以下是我们如何解决它。运行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指南中的代码来说明问题。

1 个答案:

答案 0 :(得分:0)

我会做以下两种方式之一,不是出于性能原因,只是为了清晰表达:

是否有任何清单属于@assembly和@part?

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

或者,@assembly和@part是否共享任何清单?

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