Here is my code: http://gist.github.com/180875 Please note that I''ve outlined the issue in the link but will add a bit more information here in terms of processing: The method is a universal method for approx. 37 models. This means that 37 models will use this method to create and update data that is being parsed from ncaa.org. There are 37 constants which contain all of the fields representing that particular model''s table. When no data is found, the values for those constants are created for each model''s current week. The issue I''m having is when trying to use the same constant to update data on top of the current week if data already exists. I thought I would be able to use save or save! but those methods won''t exist with the current way I''m processing the data. If anyone can help me with the last part of the method after (else) where I''m trying to update the data, I''d appreciate it. I''ve added notes to the link to help. -- Posted via http://www.ruby-forum.com/.
Why won''t model.update_attributes(values) work?
jhaagmans wrote:> Why won''t model.update_attributes(values) work?It will give the following error: undefined method `update_attributes'' for #<Class:0x902444c> values is a hash As an example, The first field in the table is rank, so values[field] is values[:rank] OR {:compiled_on=>"2009-09-04", :rank=>"1"}:Hash -- Posted via http://www.ruby-forum.com/.
Frederick Cheung
2009-Sep-04 14:06 UTC
Re: Unsure of how to update values using a constant
On Sep 4, 2:25 pm, Alpha Blue <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> > When no data is found, the values for those constants are created for > each model''s current week. The issue I''m having is when trying to use > the same constant to update data on top of the current week if data > already exists. I thought I would be able to use save or save! but > those methods won''t exist with the current way I''m processing the data. > > If anyone can help me with the last part of the method after (else) > where I''m trying to update the data, I''d appreciate it. >update expects either an id and a hash of attributes, or a hash of ids to attributes, ie update(1, {:name => ''bob''}) update the row with id 1 and sets the name to bob. the other form assumes you are passing an array of ids, and an array of hashes, so update([1,2], [{:name => ''bob''}, {:name => ''alice''}]) update the row with id 1 and sets the name to bob and updates the row with id 2 and sets the name to alice Fred
Thanks for the explanation Fred. With create I didn''t have to specify the row ids to update because it was simply creating them. I''ll find a way to locate the row to update and pass the id and hash,.. thanks. -- Posted via http://www.ruby-forum.com/.
As a quick and dirty test, puts "Updating Current Data in #{model} for the following teams:" x = 0 y = model.compiled_this_week.find(:all) parser_object.rows.each do |row| team = Team.find_by_name(row[1]) values = {:compiled_on => Date.today.strftime(''%Y-%m-%d'')} constant.each_with_index do |field, i| if row[i] == row[1] values[field] = team.id else values[field] = row[i] end end # List each team we update puts team.name + " ID = " + team.id.to_s model.update(y[x], values) x += 1 end This portion of the update process works fine using this. However, I had to call model find again and iterate over the ids in no particular order. I don''t mind iterating over the ids without a precise order because the data being overwritten is being overwritten for the current week against 120 rows of data. So, it doesn''t matter if they are in a different order, so long as the data for each row is exact, which by this quick and dirty test is. I''ll have to find a cleaner way of implementing it though. -- Posted via http://www.ruby-forum.com/.