1

mongodb の構文:

db.orders.aggregate(
   {$unwind: "$lines"},
   {$group : 
             {_id: {sku: "$lines.sku", desc: "$lines.description"}, 
             qty : {$sum : 1}}},{ $sort : { qty : -1}}
                   )

上記のクエリの結果を Rails で表示したいと考えています。

Rails 4 と Gemfile で Mongoid を使用しています。

gem 'mongoid', github: 'mongoid/mongoid'

私が理解しているように、上記のクエリを記述する唯一の方法は、モペットドライバー用の gem をインストールすることです。それで、私の最初の質問は、Rails 4 および Ruby 2.0 の Gemfile でその行をどのように宣言する必要があるかということです。

モペットのクエリは次のようになると思います。

Order.collection.aggregate(
    {"$unwind" => "$lines"},
    {"$group" => {"_id" => {"sku" => "$lines.sku", desc => "$lines.description"}, 
    qty => {"$sum" => 1}}},
    { "$sort" => { "qty" => -1}})

パラメータを渡さずにインデックスページのボタンをクリックして、このクエリの結果を表示したいと思います。2 番目の質問は、コントローラーとインデックス ビュー ページを変更して、このクエリを呼び出すボタンを配置する方法がわからないということです。


アップデート

以下のようにコントローラーの index メソッド部分:

  def index
    @orders = if params[:search]
      Order.search(params[:search]).queryable.asc(:_id).paginate(:page => params[:page], :per_page => 20)
    elsif params[:search_from] && params[:search_to]
      Order.search_date(params[:search_from], params[:search_to]).queryable.asc(:_id).paginate(:page => params[:page], :per_page => 20)
    else
      Order.shipping_today(Date.today, Date.today).queryable.asc(:_id).paginate(:page => params[:page], :per_page => 20)
    end

index.html.erb:

<h1>Date: <%= Date.today %></h1>

<%= form_tag orders_path, :method => 'get' do %>
<p>Order date range:<br>  
    <%= text_field_tag :search_from, params[:search_from] %> - <%= text_field_tag :search_to, params[:search_to] %>
    <%= submit_tag "Search", :name => nil %>
</p>
<% end %>

<%= form_tag orders_path, :method => 'get' do %>
<p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
    <%= link_to "Reset", orders_path %>
</p>
<% end %>

<%= form_tag orders_path, :method => 'get' do %>
<p>
    <%= submit_tag "Statistics", :name => nil %>
</p>
<% end %>

<div class="digg_pagination">
    <div class="page_info">
      <%= page_entries_info @orders %>
    </div>
    <%= will_paginate @orders, :container => false %>
  </div>

  <br />

<table border = 1 >
  <thead>
    <tr>
      <th>Shipping date</th>
      <th>Order #</th>
      <th>Ship to name</th>
      <th>Tracking #</th>
      <th>Shipped</th>
      <th>Action</th>
      <th></th>
    </tr>
  </thead>

  <tbody>
  <% @orders.each do |order| %>
    <tr>
      <td><%= order.shipping_date %></td>
      <td><%= link_to order.order_number, order_path(order) %></td>
      <td><%= order.ship_to_fname %></td>
      <td><%= order.track_num %></td>
      <td><%= order.ship_date %></td>
      <td><%= link_to 'Edit', edit_order_path(order) %></td>
      <td><%= link_to 'New', new_order_path(order) %></td>
      <td><%= link_to 'Destroy', order, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
</tbody>
</table>

<br />

<%= link_to 'New Order', new_order_path %>
4

1 に答える 1