Boolean database + Site Design/Architecture Question

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)

I would go with a single 'status' field.

Roy Pardee wrote:

I would go with a single 'status' field.

Thanks Roy, I appreciate the reply. I guess I could just do a...

[code]
if @child.status == 'lost'
  ...
[/code]

I did like the elegance of boolean for things like:

[code]
if @child.is_lost?
  ...
[/code]

Any other suggestions or opinions?

Well, you can still have those is_whatever? methods--just write them on the model your own self:

class Child
  def is_lost?
    self.status == 'lost'
  end
  def is_found?
    self.status == 'found'
  end
  def is_safe?
    self.status = 'safe'
  end
end

You could even write your own setters (def is_safe=(new_val)), tho that may be taking it too far...

Roy Pardee wrote:

Well, you can still have those is_whatever? methods--just write them on
the model your own self:

Touché. Can't believe I didn't think about that! Thank you!!

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!)

I hate to bump and annoy, but can anyone offer a suggestion on my last
reply?

Thanks!

-Tony