我有四个模特。
产品 类别 分类 图像
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 :(得分: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 %>