在Rails中有一种方法可以根据数据库中的变化进行方法调用吗?例如,假设我有两个类:Products
和Orders
。
订单有三个可能的枚举值:
class Order < ActiveRecord::Base
enum status: [:pending, :processing,:shipped]
belongs_to :products
end
我想批量处理Orders
所以当产品有50个订单时,我希望它将与之关联的所有订单设置为已处理。 Orders
默认为:pending
。要将订单更改为:processing
,我会致电order.processing!
。我可以在Products模型中编写一个方法,如:
def process_orders
if self.orders.count=50
self.orders.each do |order|
order.processing!
end
end
这个问题是我必须调用process_orders
方法来执行它,无论如何我可以让它在产品有50个订单后自动执行吗?
答案 0 :(得分:3)
这听起来像是使用Active Record Callback的好机会。
class Order < ActiveRecord::Base
belongs_to :product
after_save do
product.process_orders if product.pending_threshold_met?
end
end
class Product < ActiveRecord::Base
has_many :orders
def pending_threshold_met?
orders.where(status: :pending).count >= 50
end
end
答案 1 :(得分:3)
我认为您可以使用update_all一次更新所有订单的status
列,而不是逐个循环播放:
self.orders.update_all(status: :processing)
并将其包装在回调中。
这样的事情:
class Order < ActiveRecord::Base
after_save do
product.process_orders if product.has_fifty_pending_orders?
end
# rest of your model code
end
class Product < ActiveRecord::Base
# rest of your model code
def process_orders
self.orders.update_all(status: :processing)
end
def has_fifty_pending_orders?
self.orders.where(status: :pending).count >= 50
end
end