2013-07-08 2 views
1

Синтаксис в MongoDB:как показывают результаты агрегации на Rails 4

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

Я хочу, чтобы показать результат выше запроса на Rails.

Я использую Mongoid с Rails 4 и моей Gemfile:

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

Как я понимаю, единственный способ написать запрос выше, чтобы установить камень для мопеда водителя. Итак, мой 1-й вопрос - как эта строка должна быть объявлена ​​в Gemfile для Rails 4 и Ruby 2.0?

Я предполагаю, что запрос в мопеде будет выглядеть так:

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

Я хотел бы показать результаты этого запроса, нажав кнопку на индексной странице без передачи параметров. 2-й вопрос заключается в том, что я не могу понять, как изменить страницу просмотра контроллера и индекса, чтобы поставить кнопку, которая будет вызывать этот запрос.


UPDATE

индексный метод часть контроллера, как показано ниже:

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 %> 

ответ

2

Строка в Gemfile, что вы написали gem 'mongoid', github: 'mongoid/mongoid' РЕКОМЕНДУЕМЫМ достаточно, чтобы этот запрос работал.

После aggregate commant вы получите массив с результатом агрегации. Вы можете назначить его переменной экземпляра в контроллере и повторить ее просмотр.

Например:

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

# lines/index.html.erb 
<ul> 
    <% @lines.each do |line| %> 
    <li> 
     <b><%= line['_id']['sku'] %></b> 
     <%= line['qty'] %> 
    </li> 
    <% end %> 
</ul> 
+0

Спасибо! Я обновил свой пост с помощью метода индекса, который у меня уже есть. Мой вопрос был не ясен, поэтому я также обновил свой второй вопрос. Я понимаю, что вы показали выше, мне просто интересно, как я буду называть этот запрос, нажав кнопку на странице просмотра индексов, и где в методе индекса я должен поместить код, показанный выше. – Askar

+0

Мне интересно, как это сделать с помощью PostgreSQL –

Смежные вопросы