Greetings, I have a method from which I want to generate CSV files based on the model name: def export_table_to_csv(table) require ''csv'' @table = table @results = @table.find(:all) @titles = @table.column_names report = StringIO.new CSV::Writer.generate(report, '','') do |title| title << @titles @results.each do |result| title << result.attributes.values end end report.rewind file = File.open("#{RAILS_ROOT}/the_directory/#{@table}.csv", "wb") file.write(report.read) end The above script works fine right now, however the call to result.attributes.values returns them in a different order than @table.column_names, so that the values end up in the wrong places. ie. the name will be under the email column etc. any thoughts on how I can make it spit out in the order it''s in from the database? Cheers, Jason -- 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?hl=en -~----------~----~----~----~------~----~------~--~---
Jason Pfeifer wrote:> Greetings, I have a method from which I want to generate CSV files based > on the model name: > > def export_table_to_csv(table) > > require ''csv'' > > @table = table > @results = @table.find(:all) > @titles = @table.column_names > > report = StringIO.new > CSV::Writer.generate(report, '','') do |title| > title << @titles > @results.each do |result| > title << result.attributes.values > end > end > > report.rewind > file = File.open("#{RAILS_ROOT}/the_directory/#{@table}.csv", "wb") > file.write(report.read) > > end > > The above script works fine right now, however the call to > result.attributes.values returns them in a different order than > @table.column_names, so that the values end up in the wrong places. ie. > the name will be under the email column etc. > > any thoughts on how I can make it spit out in the order it''s in from the > database?Replace title << result.attributes.values with title << @titles.map { |a| result.send(a) } -- Rails Wheels - Find Plugins, List & Sell Plugins - http://railswheels.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?hl=en -~----------~----~----~----~------~----~------~--~---
> title << @titles.map { |a| result.send(a) }thanks! That''s working great. Would you care to explain for me how that works? When I read the code, I think this: @titles.map iterates over each item in the titles array, so if I were just to do: @titles = [1, 4, 6, 8] @titles.map { |a| a + 2 } => [3, 6, 8, 10] So if I have that correct, I don''t understand how the send method operates on the result object. Is it just passing a method name? I guess I was just mistakenly thinking of it in terms of key value pairing: result.send(a) AS result[a] Thanks. Jason -- 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?hl=en -~----------~----~----~----~------~----~------~--~---
And, for anyone needing the code to dump any database table to a CSV file, here is the refactored, much tidier code using fastercsv def table2CSV(table) require ''fastercsv'' @table = table @titles = @table.column_names @users = @table.find(:all) FasterCSV.open("#{RAILS_ROOT}/csv_directory/#{@table}.csv", "wb") do |csv| csv << @titles @users.each do |user| csv << @titles.map { |a| user.send(a) } end end end -- 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?hl=en -~----------~----~----~----~------~----~------~--~---
Jason Pfeifer wrote:> So if I have that correct, I don''t understand how the send method > operates on the result object. Is it just passing a method name? I > guess I was just mistakenly thinking of it in terms of key value > pairing: > > result.send(a) AS result[a]result.send(a) just calls the method with name a on the result object. result[a] would also be acceptable, accessing the attribute directly, but failing if you''ve written a custom accessor method for that attribute. -- Rails Wheels - Find Plugins, List & Sell Plugins - http://railswheels.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?hl=en -~----------~----~----~----~------~----~------~--~---