计算铁路中的订单总数

时间:2014-05-04 13:38:43

标签: ruby-on-rails ruby-on-rails-4

我对rails非常陌生,到目前为止,我试图计算订单总数而没有太多运气。我没有篮子或购物车模型,而是将物品放在篮子里。我想在创建订单之前显示购物篮中产品的总价格。

我有订单型号,产品型号和Order_Product型号。

在我的订单模型中,我有以下关系:

has_many :order_products
has_many :products, through: :order_products

在我的产品型号中,我有以下关系:

has_many :order_products
has_many :orders, through: :order_products

在我的Order_Product模型中,我有以下关系:

  belongs_to :order
  belongs_to :product

在我的订单模型中,我有以下方法:

def total
    products.sum(&:price)
end 

在视图中我有:

<%= @order.total%>

我有一个带有以下内容的篮子控制器:

def create


    product = Product.find(params[:product_id])

    basket.add(product.id)

    flash[:success] = "Product added to basket"

    redirect_to product_path(product)

end

带有这个的订单控制器:

def new

@order = Order.new

    basket.each do |item_id|
        @order.order_products.build(product: Product.find(item_id))
    end

end

以下是我的应用程序控制器中的篮子会话:

def basket
session[:basket] ||= Set.new
end

不会抛出任何错误,但视图中呈现的总数为&#39; 0&#39;尽管订单中有物品。任何人都可以帮忙,因为我不知道该怎么做?

非常感谢

2 个答案:

答案 0 :(得分:2)

  

没有错误被抛出,但视图中呈现的总数为“0”,尽管订单中有项目。

所选的products位于basket(存储在会话中)中,但尚未与order相关联。因此,总计将呈现为0

从评论中抓住线索。 根据您对Babar评论的回复:

  

Babar:我相信你想在创建订单之前从购物篮中的产品中显示你的观点中的总价吗?詹姆斯:是的   这是完全正确的!

为了显示购物篮中产品的浏览总价,您可以在app/helpers/products_helper.rb文件中添加帮助方法。这样,该方法将在app/views/products目录下的所有视图中自动提供。

module ProductsHelper
  def basket_total
    Product.where(id: basket.to_a).sum(:price)
  end
end

此外,如果您计划在整个网站的所有网页的标头中显示mini-basket,那么最好在ApplicationHelper模块中移动辅助方法({{1} })因此它将自动在您的应用程序中的所有视图中可用。

app/helpers/application_helper.rb

接下来,最好在module ApplicationHelper def basket_total Product.where(id: basket.to_a).sum(:price) end end 中移动basket方法,以便ApplicationHelper以及您的观点可以访问这些方法。

因此,您更新的basket_total应如下所示:

ApplicationHelper

为了使module ApplicationHelper def basket_total Product.where(id: basket.to_a).sum(:price) end def basket session[:basket] ||= Set.new end end 中的方法适用于所有控制器,您需要更新ApplicationHelperApplicationController),如下所示:

app/controllers/application_controller.rb

最后,要访问视图中的class ApplicationController < ActionController::Base include ApplicationHelper ## Add this ## ... end 方法,请使用

basket_total

答案 1 :(得分:1)

Kirti的答案更好用

创建一个帮助方法解决了这个问题,代码是:

def total
    price=Product.find(session[:basket].to_a).collect{|product| product.price}.sum
end