Hi, I'm writing a migration script which has to, well, actually migrate all data from table A to table B, but I need to access the application logic in model A for each row migrated. I could do this: MyModel.all.each do |instance| # do stuff... end but as far as I know that would pre-instantiate all records in memory beforehand, which could be *really bad* with the amount of records I'm dealing with, and I only really need to work with a record at a time. An alternative I'm currently using is: execute("SELECT * FROM table_a").each_hash do |row| instance = MyModel.new(row) end but I believe this is also sub-optimal (especially since some attributes are attr_protected, therefore I'm having to take care of those manually, and other reasons). Is there any obvious/elegant way of doing this I'm missing? Thanks, -Pedro
on 2008-10-28 18:44
on 2008-10-28 22:36
> dealing with, and I only really need to work with a record at a time. Hi, Have you thought of using limit and a offset with a regular find? (below is the code but I didn't check if it's valid) current_offset = 0 limit = 100 begin result = MyModel.find(:all, :limit=>limit, :offset=>current_offset) #some operations current_offset += limit end while result.size == 0
on 2008-10-28 22:55
Nice one, thanks!