2011-11-20 16 views
10

私はRails 3.1アプリケーションの1つでActiveRecordを使用してstate_machineを使用します。私は、異なる状態のレコードにアクセスするための構文が煩雑であることを発見しました。スコープ定義を手作業で書くことなく、各状態を同時にスコープとすることは可能ですか?state_machineの状態の名前付きスコープ

は、たとえば次の点を考慮

class User < ActiveRecord:Base 
    state_machine :status, :initial => :foo do 
    state :foo 
    state :bar 

    # ... 
    end 
end 

# state_machine syntax: 
User.with_status :foo 
User.with_status :bar 

# desired syntax: 
User.foo 
User.bar 

答えて

2

を私はまた、この機能を必要としますが、state_machineは似たものを持っていません。このgistが見つかりましたが、aasmはこの場合はより良い状態マシンのように見えます。私は私のモデルに次の追加している

+0

ありがとう、これは本当に有用な要点です。スコープに関するこの問題を除いて、私の場合は 'state_machine'という宝石が優れていることがわかりました。 – Andrew

16

あなたはこれを数える場合
state_machine.states.map do |state| 
    scope state.name, :conditions => { :state => state.name.to_s } 
end 

わからない「手でスコープの定義を書いて?」私は状態名との競合があることは決してありませんので、これを使用したい

class Vehicle < ActiveRecord::Base 
    named_scope :with_states, lambda {|*states| {:conditions => {:state => states}}} 
    # with_states also aliased to with_state 

    named_scope :without_states, lambda {|*states| {:conditions => ['state NOT IN (?)', states]}} 
    # without_states also aliased to without_state 
end 

# to use this: 
Vehicle.with_state(:parked) 

:誰かがまだこれを探している場合

+0

このLarsコードは、state_machineブロックの後に追加する必要があることに注意してください。 – tomaszbak

8

念のため、state_machineを定義しながら加え、以下の方法があります。 state_machine's ActiveRecord integration pageについて詳しくは、こちらをご覧ください。私はあなたのモデルがあまりにも多state_machinesを持っている場合に使用することができる方法が表示されます

scope :cancelled, lambda { with_state([:cancelled_by_user, :cancelled_by_staff]) } 
+0

OPはすでにこれを知っています。彼は 'Vehicle.with_state(:parked) 'の代わりに' Vehicle.parked'という名前の異なるスコープを作成できるかどうかを尋ねています。 –

+0

thnx for bonus)))thats it! – cubbiu

+0

Rails 3では、named_scopeの名前がscopeに変更されていることに注意してください。 – cubbiu

0

ボーナスはそれが私はしばしばのような何かをするように、配列を渡すことを可能にするということです。

あなたの状態が整数の場合でも動作します。

関連する問題