2016-04-19 13 views
1

私はサプライヤがさまざまなバリエーションを使って販売している製品のリストをループしようとしています。私は表示する製品のリストを得ることができますが、私はそれらを1回だけ表示するように製品IDでグループ化したいと思います。私のコントローラでビューまたはコントローラでグループ

私は

- @supplier.variants.group_by(&:product_id).each do |product_id, item| 
    = render :partial => 'product', :locals => {:item => item } 

とを持っている私の見解で

@supplier = Supplier.joins(products: :variants).find(params[:id]) 

を持っている私の部分SQLは返します次のクエリを実行し

= link_to shopping_supplier_path(item) do 
    %li.mdl-list__item.mdl-list__item--three-line 
    %span.mdl-list__item-primary-content 
     %span= item.product.name 
     %span.mdl-list__item-text-body 
     = item.product.description.downcase 
    %span.mdl-list__item-secondary-content 
     %i.material-icons 
     chevron_right 
    %hr 

Started GET "/shopping/suppliers/latte-cartelle-drive-thru-coffee-241---245-princes-hwy--ha-1" for 127.0.0.1 at 2016-04-19 23:22:08 +1000 
Processing by Shopping::SuppliersController#show as HTML 
    Parameters: {"id"=>"latte-cartelle-drive-thru-coffee-241---245-princes-hwy--ha-1"} 
    User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
    Supplier Load (32.7ms) SELECT "suppliers".* FROM "suppliers" WHERE "suppliers"."permalink" = $1 ORDER BY "suppliers"."id" ASC LIMIT 1 [["permalink", "latte-cartelle-drive-thru-coffee-241---245-princes-hwy--ha-1"]] 
    Supplier Load (41.9ms) SELECT "suppliers".* FROM "suppliers" INNER JOIN "variant_suppliers" ON "variant_suppliers"."supplier_id" = "suppliers"."id" INNER JOIN "variants" ON "variants"."id" = "variant_suppliers"."variant_id" INNER JOIN "products" ON "products"."id" = "variants"."product_id" INNER JOIN "variants" "variants_products" ON "variants_products"."product_id" = "products"."id" WHERE "suppliers"."permalink" = $1 ORDER BY "suppliers"."id" ASC LIMIT 1 [["permalink", "latte-cartelle-drive-thru-coffee-241---245-princes-hwy--ha-1"]] 
    Variant Load (0.9ms) SELECT "variants".* FROM "variants" INNER JOIN "variant_suppliers" ON "variants"."id" = "variant_suppliers"."variant_id" WHERE "variant_suppliers"."supplier_id" = $1 [["supplier_id", 1]] 
    Rendered shopping/suppliers/_product.html.haml (53.5ms) 

エラー

NoMethodError at /shopping/suppliers/latte-cartelle-drive-thru-coffee-241---245-princes-hwy--ha-1 
undefined method `name' for #<Array:0x007faa5302d5a0> 

答えて

0

使用SQL joins。使用するテーブルを結合するクエリを作成すると、あらかじめメモリにロードされるため、有名なn+1クエリは発生しません。

@supplier = Supplier.joins(variants: :products).find(params[:id]) 

# This will translate to something like this 
SELECT * FROM suppliers 
INNER JOIN variants ON variants.supplier_id = suppliers.id 
INNER JOIN products ON products.variant_id = variants.id 
WHERE suppliers.id = ? 

アソシエーションの遅延読み込みは、常に避けてください。

+0

私は製品に関連付けることはできません。 –

関連する問題