Preserving Data on Rails Migration with Override on Getter/Setter -


i'm doing migration need both (a) change column's data type , (b) preserve data in column (ie, convert new data type , keep in same column). new column type requires me override getters , setters , causes migration fail.

there user table includes field ip address of user's connection: ip_addr. string , want change integer. up method of migration looks this:

def   add_column :users, :curip, :integer   user.reset_column_information   user.all.each |u|     u.update_attribute :curip, user.ip_str_to_int(u.ip_addr)   end   remove_column :users, :ip_addr   rename_column :users, :curip, :ip_addr end 

(user.ip_str_to_int math convert ip address quads integer.)

i have methods override getter & setter ip_addr call user.ip_str_to_int , corresponding method user.ip_int_to_str. these methods this:

def ip_addr   val = read_attribute(:ip_addr)   user.ip_int_to_str(val) end  def ip_addr=(val)   write_attribute(:ip_addr, user.ip_str_to_int(val)) end 

by you've guessed problem. when migration runs, chokes, because overridden getter/setters expect column contain integer, @ time migration happens, column contains string. i've tested migration , getter/setter methods separately, , they're fine. own development environment, can comment out getters/setters run migration, put them in. kludge , doesn't work production.

any suggestions? know wouldn't have problem if wasn't trying keep same column name, changing column name means changing other code.

environment: sqlite 3; ruby 2.1.4; rails 3.2.13.

you modify getter method handle case of data being string...

def ip_addr   val = read_attribute(:ip_addr)   return val if val.is_a? string   user.ip_int_to_str(val) end 

Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -