First and foremost, shouldn't your model be called Child? A single child 
shouldn't be called "a children", but that's how you have it set up. Having 
it as is won't destroy the universe, but it will end up getting really 
confusing sooner or later. Rails knows that "children" is the plural form 
of "child". Open the rails console and type "child".pluralize to see for 
yourself.

That aside, since Children is a stateful object, you should consider the Acts 
As State Machine plugin. All you need is the plugin and a "state" (varchar) 
column in the model's database table. This gives you all kinds of neat 
functionality.

In your rails app root, do this little number: 
script/plugin install 
http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk/

We will configure your model to have three states: "safe", "lost", 
and "found". In your Children model, add the following:
 
#set the default state
acts_as_state_machine, :initial => :safe 

# declare three states: "safe", "lost", and "found"
state :safe
state :lost
state :found

# configure state methods
event :lost do  
  transitions :from => :safe, :to => :lost
  transitions :from => :found, :to => :lost
end
event :found do  
  transitions :from => :safe, :to => :found
  transitions :from => :lost, :to => :found
end
event :safe do  
  transitions :from => :lost, :to => :safe
  transitions :from => :found, :to => :safe
end


That's it. Now the following methods will work to check the state:
@child.safe? # true/false
@child.lost? # true/false
@child.found? # true/false

The "events" that you declared are used to change the object's state, using 
event!. For example, to change a safe child to lost, you would call: 
@child.lost!
Normally, you would want to name your "events" some kind of verb. This makes 
the method easier to read and understand, but your situation is peculiar. I 
guess you should leave them as is to avoid any further confusion.

You can tell AASM to call additional methods when transitioning between 
states, if you wish. You can also block transitions unless certain conditions 
are met. Read up on the callbacks and guard functions here: 
http://rails.aizatto.com/2007/05/24/ruby-on-rails-finite-state-machine-plugin-acts_as_state_machine/
 
(site is currently showing a blank page, but it's there, I swear!)




On Tuesday October 21, 2008 2:58:40 pm Tony Tony wrote:
> Hi all,
>
> As usual, you've all been very helpful in the past and I thank you for
> continuing to help myself and others.
>
> Today I have the following code/database architecture question which I
> would like you guys to help me out with.
>
>
> Children Table   (user has_many children)
> --------------
> ...
> is_lost boolean, default => false
> is_found boolean, default => false
> ...
>
>
> Basically, a child is "safe" if he is not flagged as lost or found (so a
> child has 3 possible states: safe, lost, found).
>
> I created a custom validation to avoid a child from being both lost AND
> found with this:
>
> [code]
> def validate
> if is_lost? and is_found?
>       errors.add_to_base("A child can't be lost <i>AND</i> found at the
> same time!")
>     end
> end
> [/code]
>
> This all works great and validates correctly. HOWEVER, the only way I've
> been able to select if a child is lost or found is through check boxes
> (not the best way to do this). I think a drop down box would be the
> better solution to select if a child is either lost or found (or safe)
>
>
> My question is this:
>
> Is this the best way to achieve what I am trying to do? Is it better to
> just have a column in my table named "status" where the values would be
> either Safe, Lost, Found and remove the is_lost and is_found boolean
> columns instead?
>
> If the current way I designed it is good, how can I create a drop down
> box that could handle both the is_lost and is_found data?
>
>
> I know this is a disaster (in my eyes) but I would like the opinions and
> suggestions of you experienced folks.
>
>
> Thank you!!!
> -Tony
>
>
> P.S.  Let me know if you need more info or code to help you understand
> this.



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to