【发布时间】:2013-06-09 10:01:37
【问题描述】:
更新:我们是这样解决的。对两个 sn-ps 代码生成的 sql 运行 MYSQL Explain:
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 指南中获取了代码。
【问题讨论】:
-
@part.assemblies.find(@assembly.id)
标签: ruby-on-rails activerecord scopes