Rails - 计算的总和

时间:2017-03-13 20:04:09

标签: ruby-on-rails

我有一个公式,根据是否有衬垫计算出价格,我需要总计所有项目。我猜我应该把这个公式添加到控制器中,这样我就可以得到总和,但我似乎无法弄清楚如何将它添加到模型中。

模型##这不起作用##

def liner
 (((2 * order_item.length) + (2 * order_item.width)) * order_item.height + (order_item.length + order_item.width)) * current_user.company.rate
end

控制器

def edit
  @order = Order.find(params[:id])
  @order_items = OrderItem.where(order_id: @order)
end

查看##这一切都有效,除了底部的总和##

<% if @order_items.exists? %>
  <div class="well">

    <% @order_items.each do |order_item| %>
      <div class="table-responsive">
        <table class="table table-striped">
          <tbody>
            <tr>
              <td>
                <%= order_item.liner.present? ? (order_item.fitting.name + ' w/ Liner') : order_item.fitting.name %>
              </td>
              <td>
                <%= order_item.length %>"L
                  <%= order_item.width %>"W
                    <%= order_item.height %>"H
              </td>
              <td><%= order_item.quantity %> @ (<%= order_item.liner.present? ? number_to_currency((((2 * order_item.length) + (2 * order_item.width)) * order_item.height + (order_item.length + order_item.width)) * current_user.company.rate) : number_to_currency((((2 * order_item.length) + (2 * order_item.width)) * order_item.height) * current_user.company.rate) %>) =</td>
              <td>
                <td><%= order_item.liner.present? ? number_to_currency(((((2 * order_item.length) + (2 * order_item.width)) * order_item.height + (order_item.length + order_item.width)) * current_user.company.rate) * order_item.quantity) : number_to_currency(((((2 * order_item.length) + (2 * order_item.width)) * order_item.height) * current_user.company.rate) * order_item.quantity) %></td>
              <td>
                <%= link_to '<i class="material-icons">clear</i>'.html_safe, order_item, class: 'btn btn-xs btn-danger', role: 'button', method: :delete, data: { confirm: 'Are you sure?' } %>
              </td>
            </tr>
          </tbody>
        </table>
      </div>

      <% end %>
    <p><%= @order_items.sum(&:liner) %>
    </p>
  </div>
  <% end %>

我以为我需要在模型中使用两个公式...一个用于w /衬里,一个用于w / o衬里。然后当我将它们添加到视图中时,我可以得到每个的总和。

每当我尝试使用模型时,我都无法正确使用...

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

首先在模型中定义您的方法:

.execute()

要测试它,请打开rails控制台,转到您的app文件夹并输入:

import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np

x = list(range(0, 5))
y = [[2.00000000e-01,   2.00000000e-01,   2.75495888e-02,
     1.40100625e-02,   2.00000000e-01],   [1.40100625e-02,
     3.85989938e-01,   6.20454173e-03,   1.74945474e-03,
     2.00000000e-01],   [1.74945474e-03,   3.98250545e-01,
     1.24956950e-03,   2.30229281e-04,   2.00000000e-01], 
     [2.30229281e-04,   3.99769771e-01,   2.26476892e-04,
     3.05018276e-05,   2.00000000e-01],   [3.05018276e-05,
     3.99969498e-01,   3.82455658e-05,   4.04459287e-06,
     2.00000000e-01]]

fig, ax = plt.subplots()

sc = ax.scatter(x,y[0])
plt.ylim(-0.1,0.5)

def animate(i):
    sc.set_offsets(np.c_[x,y[i]])

ani = matplotlib.animation.FuncAnimation(fig, animate, 
                frames=len(y), interval=300, repeat=True) 

plt.show()

在控制台内部,获取一个实例并尝试使用您的方法:

#File: app/models/client.rb

class Client < ActiveRecord::Base
    def liner
        # your code here
    end
end

这样,您正在测试您的mehtod是否正常工作。稍后您可以在控制器或视图中使用它。

答案 1 :(得分:0)

您当前的班轮方法无效,因为它无权访问当前用户。同样在模型方法中,您不在方法中使用模型实例。您可以尝试将用户传递给方法。

class OrderItem
  def price_with_liner(user)
    (((2 * length) + (2 * width)) * height + (length + width)) * user.company.rate
  end 

要从视图中抽象出一些逻辑,您可以创建辅助方法,使视图更具可读性并便于调试。下面应该开始。

助手/ order_items_helper.rb

module OrderItemsHelper

  def price(order_item, user)
    if order_item.liner.present? 
      number_to_currency(order_item.price_with_liner(user))
    else 
      number_to_currency(order_item.price_without_liner(user))
    end
  end

end

视图

<td><%= price(order_item, user) </td>