gpt4 book ai didi

ruby-on-rails - :counter_cache for total items

转载 作者:行者123 更新时间:2023-12-04 06:10:34 24 4
gpt4 key购买 nike

我有一组简单的两个相关表的“订单”,其中有许多“line_items”。还有一个与订单项相关联的数量,例如

订单1
line_item a:'为初学者编织的篮子',数​​量:3
line_item b: 'a dummies guide to vampirism', 数量:1

当我建立迁移时,我可以使用以下方法包括数量:

Order.find(:all).each do |o|
o.update_attribute :line_items_count, o.line_items.map(&:quantity).sum
end

这给了我正确的项目数 (4),但我似乎无法在 Order 模型上执行此操作,因为我无法传递订单项的数量,所以它只是计数订单项的数量 (2)。

所以在 line_item 模型中我有:

belongs_to :order, :counter_cache => true

有什么方法可以指定数量,使其正确显示 4 而不是 2?

最佳答案

“counter_cache”功能旨在维护相关项的计数(而非总和)。

您可以通过编写几行 ruby​​ 代码轻松实现这一目标。

让我们假设您的 orders 表中有一个名为 line_items_sum 的列。此列的值应默认为 0。

class AddLineItemsSumToOrder < ActiveRecord::Migration
def self.up
add_column :orders, :line_items_sum, :integer, :default => 0
end

def self.down
remove_column :orders, :line_items_sum
end
end


class Order < ActiveRecord::Base
has_many :line_items
end

现在将回调添加到 LineItem 类。

class LineItem < ActiveRecord::Base
validates_numericality_of :quantity
belongs_to :order
after_save :update_line_items_sum

private
def update_line_items_sum
return true unless quantity_changed?
Order.update_counters order.id,
:line_items_sum => (quantity - (quantity_was || 0))
return true
end
end

关于ruby-on-rails - :counter_cache for total items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5332243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com