2011-11-08 128 views
1

我有产品和股票。每个股票包含product_id, color_id, storage_id and in_stock导轨组通过使嵌套表

对于给定的产物I通过存储要组股然后颜色和输出IN_STOCK等:

寄存1

  • 寄存1
    • A色:IN_STOCK
    • B色: in_stock
  • 存储2:
    • 色:IN_STOCK
    • 彩色B:IN_STOCK

可惜我不能渲染视图。

到目前为止,我的查询如下:

def all_units_in_stock 
    stocks.in_stock.group(:storage_id, :color_id).includes(:storage, :color) 
end 

which returns 
Product.find(11).all_units_in_stock 
Product Load (37.1ms) SELECT "products".* FROM "products" WHERE "products"."id" = ? LIMIT 1 [["id", 11]] 
Stock Load (0.3ms) SELECT "stocks".* FROM "stocks" WHERE "stocks"."product_id" = 11 AND (in_stock > 0) GROUP BY storage_id 
Storage Load (0.2ms) SELECT "storages".* FROM "storages" WHERE "storages"."id" IN (1, 2, 3, 4, 5) 
Color Load (0.2ms) SELECT "colors".* FROM "colors" WHERE "colors"."id" IN (3) 
=> [#<Stock id: 162, product_id: 11, storage_id: 1, in_stock: 10.0, created_at: "2011-11-07 22:54:50", updated_at: "2011-11-07 22:54:50", color_id: 3>, #<Stock id: 163, product_id: 11, storage_id: 2, in_stock: 10.0, created_at: "2011-11-07 22:54:50", updated_at: "2011-11-07 22:54:50", color_id: 3> 

回答

0

整理存储,然后色。然后对结果使用group_by函数,这将创建一个以Storage ID为关键字的有序散列。由于您通过存储&颜色进行了排序,因此排序将保留在散列中。

products = Product.find(11).all_units_in_stock 
@group_by_storage = products.group_by {|p| p.storage_id } 

现在在您的视图中,您可以遍历散列。

<% @group_by_storage.each do |key, value| %> 
    <ul> 
    <li><%= key %> 

     <ul> 
     <li><%= value.color_id %> 
     </ul> 
    </li> 
    <ul> 

请原谅erb语法,如果正确的话,我习惯了HAML标记。