I would like to leverage the Rails migration functionality but use it for producing migrate files that migrate DATA changes instead of SCHEMA changes. For an example, instead of having: class MigrateName < ActiveRecord::Migration def self.up add_column :users, :new_user_column, :float end def self.down remove_column :users, :new_user_column end end I need something like: class MigrateName < ActiveRecord::Migration def self.up User.create({:id => 5, :name => "John"}) User.create({:id => 6, :name => "John2"}) User.delete(1) User.update(2, {:name => "Mary_after"}) end def self.down User.delete(5) User.delete(6) User.create({:id => 1, :name => "Jack"}) User.update(2, {:name => "Mary_before"}) end end This way running ''rake migrate'' will update to the latest DATA SET. Anyone try to do something like this before? Is this a good way to go about doing this? I know I could just do DB dumps to flat files, but these databses could get quite large and I would like to have ''relatively'' small migrate files that are much more usable than flat DB dumps. Another way I thought of doing this was to produce patch files from running diff and keep track of these. However, something like the above seemed more elegant. The tricky part here is that in order to produce these migrate files, I need to be able to have two different databases to compare against. How can I use one ActiveRecord class but programmatically switch what DB it is pointing at? I imagine that some sort of factory would be needed for this. For example: user_from_db1 = ObjectFactory(User.find_by_id(22), "DB1") user_from_db2 = ObjectFactory(User.find_by_id(22), "DB2") user_from_db1.name # "Fred" user_from_db2.name # "Alice" At this point I could then determine what to write in both the self.up and self.down methods above if I were iterating through each user to see how DB1 and DB2 were different. This looks like it will be somewhat complex, so I''m mainly looking to see if anyone has successfully tackled this before or if anyone knows of a better way to do this. -- 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 -~----------~----~----~----~------~----~------~--~---
I hate to say it, but my guess as to how to do this best would be to copy your table to a backup table. Then, apply your data changes. To roll back all you would have to do would be to drop or empty the current table and restore the old backup. I would think that would be the easiest way. Caleb wrote:> I would like to leverage the Rails migration functionality but use it > for producing migrate files that migrate DATA changes instead of SCHEMA > changes. For an example, instead of having: > > class MigrateName < ActiveRecord::Migration > def self.up > add_column :users, :new_user_column, :float > end > > def self.down > remove_column :users, :new_user_column > end > end > > I need something like: > > class MigrateName < ActiveRecord::Migration > def self.up > User.create({:id => 5, :name => "John"}) > User.create({:id => 6, :name => "John2"}) > User.delete(1) > User.update(2, {:name => "Mary_after"}) > end > > def self.down > User.delete(5) > User.delete(6) > User.create({:id => 1, :name => "Jack"}) > User.update(2, {:name => "Mary_before"}) > end > end > > This way running ''rake migrate'' will update to the latest DATA SET. > Anyone try to do something like this before? Is this a good way to go > about doing this? I know I could just do DB dumps to flat files, but > these databses could get quite large and I would like to have > ''relatively'' small migrate files that are much more usable than flat DB > dumps. > > Another way I thought of doing this was to produce patch files from > running diff and keep track of these. However, something like the above > seemed more elegant. > > The tricky part here is that in order to produce these migrate files, I > need to be able to have two different databases to compare against. How > can I use one ActiveRecord class but programmatically switch what DB it > is pointing at? I imagine that some sort of factory would be needed for > this. For example: > > user_from_db1 = ObjectFactory(User.find_by_id(22), "DB1") > user_from_db2 = ObjectFactory(User.find_by_id(22), "DB2") > > user_from_db1.name # "Fred" > user_from_db2.name # "Alice" > > At this point I could then determine what to write in both the self.up > and self.down methods above if I were iterating through each user to see > how DB1 and DB2 were different. > > This looks like it will be somewhat complex, so I''m mainly looking to > see if anyone has successfully tackled this before or if anyone knows of > a better way to do this. > > -- > 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 -~----------~----~----~----~------~----~------~--~---
Caleb wrote:> I would like to leverage the Rails migration functionality but use it > for producing migrate files that migrate DATA changes instead of SCHEMA > changes. For an example, instead of having: > > class MigrateName < ActiveRecord::Migration > def self.up > add_column :users, :new_user_column, :float > end > > def self.down > remove_column :users, :new_user_column > end > end > > I need something like: > > class MigrateName < ActiveRecord::Migration > def self.up > User.create({:id => 5, :name => "John"}) > User.create({:id => 6, :name => "John2"}) > User.delete(1) > User.update(2, {:name => "Mary_after"}) > end > > def self.down > User.delete(5) > User.delete(6) > User.create({:id => 1, :name => "Jack"}) > User.update(2, {:name => "Mary_before"}) > end > end > > This way running ''rake migrate'' will update to the latest DATA SET. > Anyone try to do something like this before? Is this a good way to go > about doing this? I know I could just do DB dumps to flat files, but > these databses could get quite large and I would like to have > ''relatively'' small migrate files that are much more usable than flat DB > dumps. > > Another way I thought of doing this was to produce patch files from > running diff and keep track of these. However, something like the above > seemed more elegant. > > The tricky part here is that in order to produce these migrate files, I > need to be able to have two different databases to compare against. How > can I use one ActiveRecord class but programmatically switch what DB it > is pointing at? I imagine that some sort of factory would be needed for > this. For example: > > user_from_db1 = ObjectFactory(User.find_by_id(22), "DB1") > user_from_db2 = ObjectFactory(User.find_by_id(22), "DB2") > > user_from_db1.name # "Fred" > user_from_db2.name # "Alice" > > At this point I could then determine what to write in both the self.up > and self.down methods above if I were iterating through each user to see > how DB1 and DB2 were different. > > This looks like it will be somewhat complex, so I''m mainly looking to > see if anyone has successfully tackled this before or if anyone knows of > a better way to do this. > > -- > Posted via http://www.ruby-forum.com/.Migrations can pretty much run arbitrary code in the up and down methods. The only time it''s an issue is if you change the model and then try to manipulate objects in the same migraiton. It should not be too difficult to have a migration load a fixture into a database table from a YAML file. _Kevin --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---