2012-10-09 187 views
0

我有3種型號:Ruby on Rails的ActiveRecord的3路連接

class ProductLine < ActiveRecord::Base 
    has_many :specifications 
    has_many :specification_categories, :through => :specifications, 
end 

class Specification < ActiveRecord::Base 
    belongs_to :product_line 
    belongs_to :specification_category 
end 

class SpecificationCategory < ActiveRecord::Base 
    has_many :specifications 
    has_many :product_lines, :through => :specifications 
end 

基本上,我們顯示的規格數據的產品網頁上的一個子集,我們想這樣做(例如只,是的,我知道的N + 1):

控制器:

@product_line = ProductLine.find(params[:id]) 
@specification_categories = @product_line.specification_categories) 

查看:

@specification_categories.each do |specification_category| 
... 
specification_category.specifications.each do |specification| 
    ... 
end 
end 

這裏的問題是讓rails過濾ProductLine的規範。我試過構建查詢來做到這一點,但當最終的關聯被調用時,它總是生成一個單獨的NEW查詢。即使我們現在沒有使用上面的代碼(這裏不是一個好主意,因爲我們可能會遇到N + 1問題),但我想知道是否有可能通過關聯過濾進行三方加入。有沒有人跑過這種情況?你能提供一個我如何在這裏完成的例子嗎?

+0

您可以請分享您的日誌,顯示SQL語句。 ActiveRecord盡力優化數據庫調用,有時會使用多個調用,我們期望只有一個調用。此外,您的目標是僅僅進行一次數據庫調用,還是優化數據庫訪問時間? –

回答

0
  1. 防止通過改變您的線路以第N + 1: @specification_categories = @ product_line.specification_categories).INCLUDE(:規格)

OR

  1. 使用構建自己的查詢.joins(:關聯),並進行分組。
+0

我沒有N + 1問題,已經修復它。我在問如何最好地進行分組。如果我嘗試自己構造查詢,它會構造一個新的查詢(select * from specifications。* where specification_category_id = 1)第二個我調用關聯而不是利用我現有的查詢。 – user1143682