2012-04-03 95 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

相关问题