2012-04-03 141 views
0

我有四種型號。顯示相似類別的產品RoR

產品 類別 分類 圖片

Product.rb

has_many :images 
has_many :categorizations 
has_many :categories, :through => :categorizations 

Category.rb

has_many :categorizations 
has_many :products, :through => :categorizations 

Categorization.rb

belongs_to :category 
belongs_to :product 

Image.rb

belongs_to :product 

當用戶點擊以查看一個產品,我想有在底部示出的圖像類似的產品的部分(基於相同的類別/類別)。

我想我的問題是,有這麼多的嵌套關係,我不知道如何提取關係。

任何幫助表示讚賞。謝謝。

回答

0

只要想一下你目前正在使用什麼對象以及你需要訪問什麼對象。在這種情況下,我假設您在控制器中設置了@product,並且您似乎希望收集@similar_products,然後您可以在頁面底部循環。

我們有一個產品可以在開始時使用。由此,我們需要與產品屬於同一類別的產品。所以,在你的控制器做

@similar_products = @product.categories.inject({}) do |result_hash, category| 
    result_hash[category.name.to_sym] => category.products.reject {|p| p == @product} 
    result_hash 
end 

所以我們最終得到的東西,看起來像這樣:

{:category_1 => [product1, product2, product3], :category_2 => [product4,product5]...} 

我可能會建議限制的產品數量爲每個類別的東西像5,通過改變在result_hash分配

result_hash[category.name.to_sym] => category.products[0..4] 

現在,在你看來,你可以通過產品按類別循環,如果你喜歡:

<% @similar_products.each do |k,product_array| # remember that the key is the name and the value is an array %> 
    <% product_array.each do |product| %> 
     <img src="<%= product.image.path %>" /> 
    <% end %> 
<% end %> 
+1

有'with_object'而不是'inject'來避免醜陋的'result_hash'結構。 – Reactormonk 2012-04-03 21:03:01

+0

感謝您的幫助。我有幾個問題。 – noob 2012-04-04 15:44:01

+0

第一個是我改變了'result_hash [category.name.to_sym] => category.products.reject {| p | (==)(product)} to result_hash [category.name.to_sym] = category.productss.order('rand()')。limit(4).reject {| p | p == @product}'。但問題是,即使我將其限制爲4個項目,但在刷新頁面時,它仍然會顯示更多項目。 – noob 2012-04-04 15:54:01

相關問題