2013-06-13 81 views
0

更新:這裏是我們如何解決它。運行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指南中的代碼來說明問題。

+0

'@ part.assemblies.find(@ assembly.id)' –

回答

0

我會做下列2種方式之一,並非出於性能的考慮,只是爲了表達清晰:

是否有屬於@assembly和@part任何體現?

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

或者,@assembly和@part共享任何清單?

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

謝謝@AJcodez。但最後我試圖儘量減少sql查詢對我的數據庫的影響。 – RidingRails