更新:這裏是我們如何解決它。運行MYSQL解釋sql生成的兩段代碼:Rails Association,Scope,JoinModel
Manifest.where(assembly_id => @ assembly.id).where(part_id => @part.id).exists? 沒有加入和RAN更快 - 因此它是!
我有以下情況:
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)' –