私は、レール 4 でキックスターターやインディーゴゴに似た e コマース プラットフォームを作成しています。商品がどのような状態になるかは、注文が十分にあるかどうかなど、さまざまな条件によって大きく異なります。たとえば、gem を使用する場合state_machine
、コードは次のようになります。
class Product < ActiveRecord::Base
has_many :orders
state_machine :initial => :prelaunch do
event :launch do
transition :prelaunch => :pending, :if => lambda {|p| p.launch_at <= Time.now }
end
event :fund do
transition :pending => :funded, :if => :has_enough_orders?
end
end
def has_enough_orders?
if orders.count > 10
end
end
次に、おそらくモデル オブザーバーを作成して、注文が行われるたびに確認product.has_enough_orders?
し、それが返された場合はtrue
を呼び出すようにしますproduct.fund!
。そのhas_enough_orders?
ため、何度もチェックされています。それはあまり効率的ではないようです。
さらにproduct.launch!
、同様の問題があります。それを実装するために私が考えることができる最善の方法は、次のようなものを使用しsidekiq
て、事前に発売された製品がlaunch_at
時間を過ぎたかどうかを確認する仕事をすることです. ただし、これも同様に汚いようです。
考えすぎですか、それともこれが通常のステート マシンの使用方法ですか?