Fernando Perez
2009-Apr-01 12:45 UTC
Denormalize DB by adding redundant foreign keys to tables
Hi, I have 3 models: User, Order(user_id), Membership(order_id). I''d like to know if a given user has a valid membership, i.e: the order.status == ''paid'' and membership.expires_at > Time.now I could use a User has_many memberships :through => :order, and put a condition but that adds membership and order logic to the User model which I don''t want. So my idea is to add a redundant user_id to membership, and to set an expires_at for a membership only when the order gets paid. This way I can''t easily query and it keeps the encapsulation of each model where it belongs to. What do you think? -- 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 -~----------~----~----~----~------~----~------~--~---
Colin Law
2009-Apr-01 12:58 UTC
Re: Denormalize DB by adding redundant foreign keys to tables
2009/4/1 Fernando Perez <rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>> > Hi, > > I have 3 models: User, Order(user_id), Membership(order_id). > > I''d like to know if a given user has a valid membership, i.e: the > order.status == ''paid'' and membership.expires_at > Time.now > > I could use a User has_many memberships :through => :order, and put a > condition but that adds membership and order logic to the User model > which I don''t want. >I would always, as a first solution, look at what the question being asked is. You want to know if ''a given user has a valid membership'', therefore use the User has_many memberships option, I would not try to turn the question on it''s head to answer it.> So my idea is to add a redundant user_id to membership, and to set an > expires_at for a membership only when the order gets paid. This way I > can''t easily query and it keeps the encapsulation of each model where it > belongs to. > > What do you think? > -- > 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 -~----------~----~----~----~------~----~------~--~---
Fernando Perez
2009-Apr-01 13:25 UTC
Re: Denormalize DB by adding redundant foreign keys to tables
> I would always, as a first solution, look at what the question being > asked > is. You want to know if ''a given user has a valid membership'', > therefore > use the User has_many memberships option, I would not try to turn the > question on it''s head to answer it.Actually this post came as an echo to my previous one: http://www.ruby-forum.com/topic/183084 I used to benefit from Rails ability to go through object associations so easily, and then it broke: My Order model used to have a response_code of type integer to handle the paid/unpaid status. And then I changed it to status of type string with the string ''paid''/''unpaid''. An suddenly I realized that I had to go over various other models to make changes too. but that''s incorrect, if I change an attribute of the Order, I shouldn''t be changing things in other models too. Something was wrong. So when I query for a paid Order and an expiry date that is in the future, where do I put the code? I can''t put it in Order, because it would have to know about expires_at, i can''t put it in membership, because it would have to know about the internal state attribute of Order which already broke on me. So where to put it? One solution is to refactor the code, and add a redundant user_id to each membership record and if the expires_at attribute is set to the future, then it means that the membership has been paid. -- 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 -~----------~----~----~----~------~----~------~--~---