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. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Pardee, Roy
2008-Oct-21 20:04 UTC
Re: Boolean database + Site Design/Architecture Question
I would go with a single ''status'' field. -----Original Message----- From: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org [mailto:rubyonrails-talk@googlegroups.com] On Behalf Of Tony Tony Sent: Tuesday, October 21, 2008 12:59 PM To: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org Subject: [Rails] 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) -------------- ... 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. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
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? -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Pardee, Roy
2008-Oct-21 20:20 UTC
Re: Boolean database + Site Design/Architecture Question
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... -----Original Message----- From: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org [mailto:rubyonrails-talk@googlegroups.com] On Behalf Of Tony Tony Sent: Tuesday, October 21, 2008 1:13 PM To: rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org Subject: [Rails] Re: Boolean database + Site Design/Architecture Question 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? -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
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!! -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Patrick Sullivan
2008-Oct-21 22:03 UTC
Re: Boolean database + Site Design/Architecture Question
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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Patrick Sullivan wrote:> 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. >Thank you immensely for bring that plugin to my attention. As for the child naming, I''m using pseudo code for the most part. Sorry about that. I just have a (silly) question about the event! calls... where do I put them? :) I tried searching for it but didn''t find an exact answer. I was able to make the state column into a drop box with the three states like so (in a hurry): [code] <%= select :child, :state, { "Safe" => "safe", "Lost" => "lost", "Found" => "found"} %> [/code] So it updates and displays the state just fine (@child.state). HOWEVER, I''m sure the use of @child.lost!, @child.found!, and @child.safe! is there for a reason. What is the best way to go about implementing this? From just some quick brainstorming I''m thinking the below if block in the update (and create) method would work, but perhaps there is a better way? [code] def update @child = Children.find(params[:id]) if params[:state]==''lost'' @child.lost! elsif params[:state]==''found'' @child.found! else @child.safe! end ... end [/code] Also, is it possible to use more than one act_as_state_machine per model? I''m assuming you can by assigning a :column => ''column_name''. But confirmation would be nice. Thank you so much again!!! -Tony -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
I hate to bump and annoy, but can anyone offer a suggestion on my last reply? Thanks! -Tony -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---