There are datatypes that need to be converted back and forth from a  
string representation: they need to be parsed both coming from the  
database, and coming from elsewhere like views.

Dates are an example, and I recently needed to implement a more  
forgiving converter for decimal numbers. So we have here at least two  
flows of execution, for example:

   post.date = "22-jan-2007" (from a view)
   post.date = "2007-01-22"  (from MySQL)

   invoice.discount = "2,3" (from view)
   invoice.dicount  = "2.3" (from MySQL)

A solution to this is to manually parse all dates and decimals in  
your actions, which is not DRY. I am looking for something more  
transparent.

A before_filter is a partial solution, it would more or less work,  
but with the current implementation if you do this

     post.date = "22-jan-2007"
     puts post.date

you get a nil instead of a Date object, because  
ActiveRecord::Base::Column#type_cast is called by the getter via  
read_attribute, who does not understand that string.

Another approach is to redefine the setter:

   def date=(v)
     v = my_date_parser(v) if v.is_a?(String)
     write_attribute(:date, v)
   end

but that breaks objet loading from the database because that setter  
is called by the database adapter as well, and going in that  
direction my_date_parser receives a String with the format used by  
the database.

I think having a custom parser for decimals and dates and other  
locale-sensitive data that comes from views is a common need, but see  
no way to hook one in the current chains of execution (in a clean way  
suitable for a framework, I've not written it but surely you can make  
a hack via Kernel.caller as a quick and dirty solution in a  
particular application).

Extending the signature of setters in the framework to pass  
additional information (say, :from => :db) is not an option because  
it would be used by adapters and thus would break existing code. Do  
you think is there some point in the framework where this could be  
addressed? I would be glad to write a patch if that was the case.

-- fxn


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to