Nathan Esquenazi
2007-Aug-30 05:40 UTC
Best way to setup this relationship in activerecord
Hello guys, I am starting a new project and I am relatively inexperienced with Database design. I would absolutely love some guidance on the best way to setup a certain relationship in ActiveRecord. I am created a searchable directory of doctors where doctors can register for an account and be added to a searchable database. Patients can then search this database to find a doctor in their area. The idea is pretty simple but discovered that doctors and patients will largely have the same information stored in the database. For instance, here is the doctor and patient models and their fields: Doctor: - id - first_name - last_name - title - gender - birthday - created_at - practice - specialty Patient: - id - first_name - last_name - title - gender - birthday - created_at Obviously there is a ton of overlap in those fields and common convention would tell me to use inheritance. Something like this: User: - id - first_name - last_name - title - gender - birthday - created_at Doctor: - practice - specialty Patient: (no extra fields) Should I listen to my gut there and use single-table inheritance via the Type column in active record? Is this the "right" way to do this. I am new to rails and databases and I want to learn "best practices" so to speak. Please help me understand the options, and what you believe is the best choice. Should I keep them two separate tables, or use inheritance or some other option that I don''t even know about. -- 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 -~----------~----~----~----~------~----~------~--~---
On Aug 30, 6:40 am, Nathan Esquenazi <rails-mailing-l...@andreas- s.net> wrote:> Hello guys, I am starting a new project and I am relatively > inexperienced with Database design. I would absolutely love some > guidance on the best way to setup a certain relationship in > ActiveRecord. > > I am created a searchable directory of doctors where doctors can > register for an account and be added to a searchable database. Patients > can then search this database to find a doctor in their area. The idea > is pretty simple but discovered that doctors and patients will largely > have the same information stored in the database. For instance, here is > the doctor and patient models and their fields: > > Doctor: > - id > - first_name > - last_name > - title > - gender > - birthday > - created_at > - practice > - specialty > > Patient: > - id > - first_name > - last_name > - title > - gender > - birthday > - created_at > > Obviously there is a ton of overlap in those fields and common > convention would tell me to use inheritance. > > Something like this: > > User: > - id > - first_name > - last_name > - title > - gender > - birthday > - created_at > > Doctor: > - practice > - specialty > > Patient: > (no extra fields) > > Should I listen to my gut there and use single-table inheritance via the > Type column in active record? Is this the "right" way to do this. I am > new to rails and databases and I want to learn "best practices" so to > speak. Please help me understand the options, and what you believe is > the best choice. Should I keep them two separate tables, or use > inheritance or some other option that I don''t even know about. > -- > Posted viahttp://www.ruby-forum.com/.Hi Nathan, I''m only just starting out with Rails too, but here are my thoughts... Using inheritance in ordinary object-oriented languages gives you a few benefits (and a few drawbacks!). Primarily, these are reuse and polymorphism. If you are going to want to define a number of similar methods on doctor and patient (including performing much of the same validation), it may be worthwhile using inheritance. This way, you can write less unit tests, and reduce duplication of code. Furthermore, if you are likely to want to access all of the users in the system, you can just iterate over Users rather than Doctors and Patients. If you are interested in using inheritance, there are a number of ways in which you can represent this relationship in your database. I would recommend reading the relevant section in Agile Web Development with Rails, if you have a copy of this book. And if you don''t, I can''t recommend it highly enough; it''s fantastic. Hope this helps! Cheers, Louis. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
Nathan Esquenazi
2007-Aug-30 21:47 UTC
Re: Best way to setup this relationship in activerecord
Thanks for your help Louis. I have found an alternative way to do this which I think is actually better. The basics is that all the overlapping fields go into a seperate model/table and then polymorphic associations are used to include the fields into each model. Check out the following link for more information: http://wiki.rubyonrails.org/rails/pages/UnderstandingPolymorphicAssociations Then you can simply use it like this: @doctor = Doctor.new(:specialty => ''family'', ...) @doctor.create_detail(:first_name => ''joe'', ...) @doctor.save @patient = Patient.new() @patient.create_detail(:first_name => ''beth'', ...) @patient.save @doctor.detail.first_name => ''joe'' @patient.detail.first_name => ''beth'' Thanks again, and if anyone thinks this way is not as good as STI please let me know. -- 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 -~----------~----~----~----~------~----~------~--~---