I'm not sure if this is where to post this, but i cannot find much
information/support for acts_as_state_machine.
I have a Friendship model which implements acts_as_state_machine. I
have an :initial state of :pending, but i would like to create a
Friendship model and save it directly with :accepted status.
I have tried Friendship.create(:state => "accepted") and Friendship.new,
friendship.state = "accepted", .save!...but neither have worked. The
only way i can accomplish this is by doing:
friendship = Friendship.create
friendship.state = "accepted"
friendship.save!
However, i do not like this since it has an unnecessary DB hit. Anybody
know how i can do this?
You could modify set_initial_state in acts_as_state_machine.rb as
follows:
def set_initial_state #:nodoc:
write_attribute self.class.state_column,
self.class.initial_state.to_s if self.state.nil?
end
That way if you specify an initial state it won't assign the default
initial state in before_create. You'd probably also need to modify
run_initial_state_actions (which is run by the after_create callback)
along the lines of:
def run_initial_state_actions
if self.state.to_sym === self.class.initial_state.to_sym
initial = self.class.read_inheritable_attribute(:states)
[self.class.initial_state.to_sym]
initial.entering(self)
initial.entered(self)
end
end
So that the actions for the default initial state don't run.
This does rather defeat the purpose of using acts_as_state_machine
though.
The thing is, then you've no longer got a state machine. It's like
having a goto in code. Could the :initial state route it to :accepted?
As far as the db access goes, that's generally the last thing you
should worry about, in my opinion.