Rails自称的方法

时间:2015-10-30 02:51:05

标签: ruby-on-rails methods enums model state

在Rails中有一种方法可以根据数据库中的变化进行方法调用吗?例如,假设我有两个类:ProductsOrders

订单有三个可能的枚举值:

    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个订单后自动执行吗?

2 个答案:

答案 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