2012-04-03 18 views
0

私は4つのモデルがあります。類似カテゴリの製品を表示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 

ユーザーが製品を見るためにクリック210

は、私は(同じカテゴリ/カテゴリに基づいて)画像の同様の製品を示して一番下のセクションを持っていると思います。

私の問題は、関係を抽出する方法がわからないほど多くのネストされた関係があることだと思います。

何か助けていただければ幸いです。ありがとう。

答えて

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[category.name.to_sym] => category.products[0..4] 

にresult_hashの割り当ては、あなたがカテゴリ別に製品をループあなたが好きなことができるかどうか:

+1

醜い 'result_hash'構造を避けるために' inject'の代わりに 'with_object'があります。 – Reactormonk

+0

助けてくれてありがとう。私はいくつかの質問があります。 – noob

+0

最初に、私は 'result_hash [category.name.to_sym] => category.products.reject {| p |制限(4).reject {| p | == @product} 'result_hash [category.name.to_sym] = category.productss.order( 'rand() p == @product} 'となります。しかし、問題は、それを4つのアイテムに制限しても、ページをリフレッシュするときに、さらに多くのアイテムを表示し続けるということです。 – noob

関連する問題