Rails模型中的项目总和-无类错误

时间:2018-07-28 22:04:38

标签: ruby-on-rails

我正在尝试将产品模型和服务模型中的值一起添加到订单模型中。我将在下面发布模型,以便明确关系。我尝试了多种选择,但实际上,如果我要添加产品项而没有服务项,则会崩溃,反之亦然。消息如下:NoMethodError (undefined method `price' for nil:NilClass):

我从here中添加了to_i,试图将Nil设为0,但还是没有运气。我要去哪里错了?

class Order < ApplicationRecord
  has_many :line_items
  before_save :update_total
  before_update :update_total
  belongs_to :user, optional: true

  def total_service_items
    self.line_items.collect { |item| item.service.price.to_i * item.quantity }.sum
  end

  def total_product_items
    self.line_items.collect { |item| item.product.price.to_i * item.quantity }.sum
  end

  def calculate_total
    total_service_items + total_product_items
  end

  def update_total
    self.total_price = calculate_total
  end    
end

订单项模型

class LineItem < ApplicationRecord
  belongs_to :order, optional: true
  belongs_to :product, optional: true
  belongs_to :service, optional: true
end

服务模型

class Service < ApplicationRecord
    has_many :line_items
end

产品型号

class Product < ApplicationRecord
    has_many :line_items
end

控制器(此操作中正在击中该控制器的Create方法)

class LineItemsController < ApplicationController     

  def create
    @order = current_order
    @item = @order.line_items.new(item_params)
    @order.save
  end

      def item_params
        params.require(:line_item).permit(:quantity, :service_id, :product_id, :unit_price, :order_id)
    end
end

1 个答案:

答案 0 :(得分:1)

您的一个或多个关联很可能niloptional: true键表明这可能正在发生。

您可以检查这些关联在您的区块中是否为present?,也可以将total分配给line_items来为您完成这项工作。我建议后者:

class LineItem < ApplicationRecord
  def total_as_product
    return 0 unless product.present? 
    product.price.to_i * self.quantity
  end 

  def total_as_service
    return 0 unless service.present?
    service.price.to_i * self.quantity
  end 
end 

在您的订单模型中:

def total_product_items
  self.line_items.collect { |item| item.total_as_product }.sum
end 

def total_service_items
  self.line_items.collect { |item| item.total_as_service }.sum
end 

在进行过程中要记住一些事情:这里可以进行一些进一步的优化-例如eager-loading your associations,这样您就不会遇到n + 1个查询。

此外:如果存在before_update,则before_save是多余的。您可以安全地删除before_update并获得相同的行为。