I''m working on a shopping cart application and I''ve run into a design question: I have a field in the cart_lines table called total_price. That field is really just a calculated field based on qty and unit_price. If either of those values change, total_price should also be updated. The way that makes the most sense to me is to write a method called total_price that defines how it should be calculated rather than modify the value directly from both the qty= and unit_price= methods. The problem is, I want that value stamped in the database so I can use it as a condition or sort field in queries. I''ve written the following code (which works fine) that loops through the object''s attributes, checks to see if a method exists with the same name, and updates the value if it''s different: class CartLine < ActiveRecord::Base before_save :recalculate def total_price qty * unit_price end def recalculate attributes.each do |attribute_name, attribute_value| if respond_to_without_attributes? attribute_name method_value = send(attribute_name) send(attribute_name + "=", method_value) if method_value !attribute_value end end end end That''s fine and it works well but I''m wondering if I''m missing something or there''s a simpler way to handle this since I''m going to have to reuse that code all over the place. If not, I could just refactor it to a plugin but I''d be surprised since it sounds like it would be a common situation. How would you handle this? Any ideas or insight would be appreciated. Thanks! --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
jaystotz wrote:> I''ve written the following code (which works fine) that loops through > the object''s attributes, checks to see if a method exists with the > same name, and updates the value if it''s different:I''m wondering if you need all of that. When you save a record in Rails all the attributes are put in the update statement (not just the ones changed). So can''t you just define total_price how you have and since total_price is a real field in the database it should get qty * unit_price without any callback. I think.... I haven''t tried it myself. :) Eric --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
You know, I assumed the same thing which led me to this question. But it turns out the values used in the update statement are based on the values in the internal @attributes hash, not the results of method calls. Defining a method named total_price does not affect the value used in the update statement. On Aug 14, 5:00 pm, Eric Anderson <e...-Es09zwCbMN9sO85lhEf0XA@public.gmane.org> wrote:> jaystotz wrote: > > I''ve written the following code (which works fine) that loops through > > the object''s attributes, checks to see if a method exists with the > > same name, and updates the value if it''s different: > > I''m wondering if you need all of that. When you save a record in Rails > all the attributes are put in the update statement (not just the ones > changed). So can''t you just define total_price how you have and since > total_price is a real field in the database it should get qty * > unit_price without any callback. I think.... I haven''t tried it myself. :) > > Eric--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---