Ruby on Rails 中 Order 模型的优化:计算订单总金额的最佳实践
Ruby on Rails 中 Order 模型的优化:计算订单总金额的最佳实践
在 Ruby on Rails 的 Order 模型中,create_line_items 方法负责创建订单项并计算订单总金额。本文将介绍如何优化该方法,使代码更简洁、高效。
问题:
在 create_line_items 方法中,total_amount 变量的定义和累加操作分散在整个方法中,代码可读性较差。
解决方案:
将 total_amount 定义为一个局部变量,并在 create_line_items 方法内部累加每个 item 的总金额。最后,在 create_line_items 方法外部返回该 total_amount 值。
以下是修改后的代码示例:
class Order < ApplicationRecord
belongs_to :user
has_many :order_items
before_create :generate_order_no
after_create :closed_job
def generate_order_no
prefix = Time.now.strftime('%Y%m%d%H%M%S')
10.times do
self.no = '#{prefix}#{format('%06d', Random.rand(999999))}'
return self.no unless Order.exists?(no: self.no)
end
Rails.logger.warn('find order no failed')
false
end
def create_line_items(items)
total_amount = 0
items.each do |data|
sku = ProductSku.find(data[:sku_id])
item = order_items.create!(
amount: data[:amount].to_i,
price: sku.price.to_i,
product: sku.product,
product_sku: sku
)
total_amount += sku.price.to_i * data[:amount].to_i
sku.with_lock do
sku.stock -= data[:amount].to_i
sku.save
end
end
total_amount
end
end
使用方法:
items = [{ sku_id: 1, amount: 2 }, { sku_id: 2, amount: 3 }]
total_amount = create_line_items(items)
puts total_amount
优点:
- 代码更简洁、易读
- 提高了代码效率,避免了不必要的变量访问
- 增强代码可维护性
总结:
通过将 total_amount 定义为局部变量并在方法内部进行累加计算,可以有效地优化 create_line_items 方法,提高代码质量和效率。
原文地址: https://www.cveoy.top/t/topic/p9Ia 著作权归作者所有。请勿转载和采集!