显示类似类别RoR的产品

时间:2012-04-03 19:40:34

标签: ruby-on-rails

我有四个模特。

产品 类别 分类 图像

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

当用户点击查看产品时,我希望底部有一个部分,显示图像类似的产品(基于相同的类别/类别)。

我想我的问题是有很多嵌套关系,我不知道如何提取关系。

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分: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]...}

我可能会建议将result_hash分配更改为

,将每个类别的产品数量限制为5。
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 %>