我正在尝试将产品模型和服务模型中的值一起添加到订单模型中。我将在下面发布模型,以便明确关系。我尝试了多种选择,但实际上,如果我要添加产品项而没有服务项,则会崩溃,反之亦然。消息如下: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
答案 0 :(得分:1)
您的一个或多个关联很可能nil
— optional: 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
并获得相同的行为。