1

ここではおそらく単純なアプローチを見落としていますが、2軸で動的なテーブルをコーディングするための最良の方法は何ですか。Rails3.2を使用しています

たとえば、次のモデルがあるとします

class Region
  has_many :shops
end

class Shop
  has_many :sales
  has_many :products, through: :sales
end

class Sale
  belongs_to :shop
  belongs_to :product
end

class Product
  has_many :sales
  has_many :shops, through: :sales
end

リージョンショービューで、列ヘッダーのショップ、行ヘッダーの製品をリストし、Sale.price各セルの平均を計算するテーブルを表示したいと思います。

ネストされたブロックの混乱に陥っていますが、計算された値が期待したものと一致していないようです。

このようなことを行うための簡単なRails-yの方法はありますか?または、私が研究できるサンプルコードを誰かに勧めてもらえますか。

私の実際のモデルは、私が十分に説明したよりも少し複雑であり、デバッグするためにコードの作業に時間を費やす必要があるのか​​、それとももっと単純なアプローチに従うべきなのか疑問に思っています。これはかなり一般的な要件のようです。

編集

私のコードの例

#views/regions/show.html.erb
<table>
  <tr>
    <th>Shop Name</th>
    <% for product in @region.products.uniq %>
      <th><%= product.name%></th>
    <% end %>
  </tr>
  <% for shop in @region.shops.uniq %>
    <tr>
      <td><%= shop.name %></td>
      <% for product in @region.products.uniq %>
        <td><%= product.sales.average(:price, conditions: ['sale.shop_id = ?', shop], :include => :sale) %></td>
      <% end %>
    </tr>
  <% end %>
</table>
4

1 に答える 1

1

これを試して、各ショップの平均売上を計算できます。

Shop.joins(:sales).average(:price, group: :product_id)

これにより、キーが製品IDであり、値がその製品の平均であるハッシュが生成されます。製品IDだけでなく詳細を表示したい場合は、:groupオプションを次のように変更できます(postgreを使用)

Shop.joins(sales: :product).average(:price, group: "product_id || ' - ' || products.name")

更新:質問でビューテンプレートを使用します(警告、これは大量のレコードセットでは遅くなります)

#views/regions/show.html.erb
<table>
  <tr>
    <th>Shop Name</th>
    <% @region.products.each do |product| %>
      <th><%= product.name%></th>
    <% end %>
  </tr>
  <% @region.shops.each do |shop| %>
    <tr>
      <td><%= shop.name %></td>
      <% shop.products.each do |product| %>
        <td><%= product.sales.where(shop_id: shop.id).average(:price) %></td>
      <% end %>
    </tr>
  <% end %>
</table>

更新:これはそれを行うためのより速い方法かもしれません

# controller
@shops = @region.shops
@products = Product.joins(:shops).where(shops: { region_id: @region.id })
@averages = Sale.joins(:shop).average(:price, group: ['shops.id', 'shops.name', 'sales.product_id])

# view
<tr>
  <th>Shop Name</th>
  <% @products.each do |product| %>
    <th><%= product.name%></th>
  <% end %>
</tr>
<% @shops.each do |shop| %>
  <tr>
    <td><%= shop.name %></td>
    <% @products.each do |product| %>
      <td><%= @averages[[shop.id, shop.name, product.id]] || 0 %></td>
    <% end %>
  </tr>
<% end %>
于 2013-02-04T05:46:03.063 に答える