Is there a way to have a custom serialization for fields in rails, a method that runs when a field is saved and loaded to convert from/to a string which is what ultimately is saved on the database.
Specifically what I want to do is have a field of type symbol like gender, with possible values :male and :female storing "male" and "female" on the database. There are some workarounds, like:
def gender
read_attribute(:gender).try(:to_sym)
end
but that leaves obj.attributes unchanged, so it's a leaky abstraction.
you can define the models to_xml for a model and it will do that http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html
its possible to define Marshall.dump and put in that way i think, but its something to look into
store them as stings in the database, but extract them as symbols when you pull them out then convert back before you save. would work with any number or combination of strings / symbols.
to limit it to only a select few
From http://blog.quov.is/2012/05/01/custom-activerecord-attribute-serializers/
You can do it in Rails 3.1. The object you want to serialize has to reply to
load
anddump
methods.Here is an example of serializing a string in Base64.
For more details see: http://archives.edgerails.info/articles/what-s-new-in-edge-rails/2011/03/09/custom-activerecord-attribute-serialization/index.html
well for just male/female you could just do a Boolean column like male and if it was false assume that meant female, add wrapper methods for it
You could use
serialize
method inside the model. Please reference to this link: http://api.rubyonrails.org/classes/ActiveRecord/Base.html (ps. search keyword "serialize" in that page ;D)In short, you could do this:
Rails would automatically serialize the field before saving to database, and deserialize it after fetched from the database.