2014-03-07 98 views
4

我有很多對許多這樣的協會軌道4 - 限量納入模型

class Product 
    has_many :categorizations 
    has_many :categories, through: :categorization 
end 

class Category 
    has_many :categorizations 
    has_many :products, through: :categorization 
end 

我想列出了第5個每一類產品的(它被簡化爲方便起見)

但我無法找到一種方法來設置包含的限制product。下面是我當前的查詢:

@categories = Category.includes(:products).all 

我發現的唯一的解決方案是增加的狀況像模型:

# Solutions that I don't like 
class Category 
    ... 
    has_many :products, include: product, limit: 5 
end 

什麼建議嗎?謝謝

回答

1

如果您在Product類上創建範圍以返回前五個對象,則可以在關係上調用該範圍。像這樣:

class Product 
    has_many :categorizations 
    has_many :categories, through: :categorization 

    scope :first_five, -> { limit(5) } 
end 

然後你就可以做到以下幾點:

@categories = Category.includes(:products) 
@categories.each do |category| 
    puts category.products.first_five.inspect 
end 

,你應該看到每個類別最多5種產品。

+0

很抱歉這麼晚纔回復,但會出現各產品附加的SQL查詢? – hrsetyono

+0

我只是做了一個測試,它確實在爲每個循環做另一個查詢。所以我得到了額外的五個SQL查詢。有更好的方法嗎?謝謝 – hrsetyono

1

條件

你可以試試這個:

#app/models/product.rb 
Class Product < ActiveRecord::Base 
    has_many :categorizations 
    has_many :categories, -> { limit(5) }, through: :categorization 
end 

如果你看看"Eager Loading Of Associations"你可以看到這種類型的想法


的ActiveRecord協會擴展的一個重要的論證

但是,我認爲這隻會產生5個類別。如果你想5爲每個類別,您還可以使用ActiveRecord Association Extenstions

#app/models/product.rb 
Class Product < ActiveRecord::Base 
    has_many :categorizations 
    has_many :categories, through: :categorization do 
     def first_five 
      limit(5) 
     end 
    end 
end 

@categories = Category.includes(:products).all 
@categories.each do |category| 
    puts category.first_five 
end 
+0

嗨,感謝您的回覆。我嘗試了你的建議。 **如果我們使用'Category.rewards'而不是'Category.includes(:獎勵)',First **僅限制產品。 **第二個**產生錯誤「未定義的方法」first_five「',但不是第二種方法與'scope'相同? – hrsetyono

+0

** note **:在上面的評論中,我意外地使用「獎勵」而不是「產品」,因爲這是真實的名稱。使用「產品」只是爲了簡化問題=)。 – hrsetyono