Newbie here working on an application that has a "Match" model and each Match can have some "Playergame" models. The rails apps is actually working, but I needed to now import some initial data from a csv file, so I built a rake task to handle the import. The problem is that for some reason I can''t seem to get "Match" to save. It doesn''t throw any errors, but after I run it and I go to the ruby console and do Match.find(:all) it returns empty. The rake task can save Playergames just find and I''ll see them if I do Playergame.find(:all) In the below script below I have the Playergame additions commented out because I simply wanted to see if I can get a Match to save alone (which it doesn''t) Any help appreciated: #striped down script task(:cvsimport => :environment) do FasterCSV.foreach("#{RAILS_ROOT}/hockey.csv") do |row| rick_game = Playergame.new steve_game = Playergame.new match = Match.new #set a bunch of fields reading over the row #left out for brevity #match.playergames << rick_game #match.playergames << steve_game #rick_game.save #this will save a game #steve_game.save #this will save a game #why is match not be saving??????????? match.save end #models... class Match < ActiveRecord::Base has_many :playergames, :dependent => :destroy accepts_nested_attributes_for :playergames end class Playergame < ActiveRecord::Base belongs_to :match, :foreign_key => "match_id" end
JangoSteve
2009-Jul-13 01:50 UTC
Re: Ideas why this rake task isn''t saving one of my models?
I''m not sure this is what is causing your problem, but according to your models, a Match has_many Playergames, which would mean that each Playergame has a match_id, correct? However, in your script, you are saving the Playergames before the Match, meaning a match_id has not yet been created. When you do Playergame.find(:all), I''m assuming they show match_id=nil. Anyway, I''d at least try changing your script to save Match before Playergames, and see if you''re still having problems... #match.playergames << rick_game #match.playergames << steve_game match.save #rick_game.save #this will save a game #steve_game.save #this will save a game On Jul 12, 8:11 pm, Rick <ric...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Newbie here working on an application that has a "Match" model and > each Match can have some "Playergame" models. The rails apps is > actually working, but I needed to now import some initial data from a > csv file, so I built a rake task to handle the import. > > The problem is that for some reason I can''t seem to get "Match" to > save. It doesn''t throw any errors, but after I run it and I go to the > ruby console and do Match.find(:all) it returns empty. The rake task > can save Playergames just find and I''ll see them if I do > Playergame.find(:all) > > In the below script below I have the Playergame additions commented > out because I simply wanted to see if I can get a Match to save alone > (which it doesn''t) > > Any help appreciated: > > #striped down script > > task(:cvsimport => :environment) do > > FasterCSV.foreach("#{RAILS_ROOT}/hockey.csv") do |row| > > rick_game = Playergame.new > steve_game = Playergame.new > match = Match.new > > #set a bunch of fields reading over the row > #left out for brevity > > #match.playergames << rick_game > #match.playergames << steve_game > > #rick_game.save #this will save a game > #steve_game.save #this will save a game > > #why is match not be saving??????????? > match.save > end > > #models... > > class Match < ActiveRecord::Base > has_many :playergames, :dependent => :destroy > accepts_nested_attributes_for :playergames > end > > class Playergame < ActiveRecord::Base > belongs_to :match, :foreign_key => "match_id" > end
On Sun, Jul 12, 2009 at 9:50 PM, JangoSteve<schwartz.steve-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > I''m not sure this is what is causing your problem, but according to > your models, a Match has_many Playergames, which would mean that each > Playergame has a match_id, correct? However, in your script, you are > saving the Playergames before the Match, meaning a match_id has not > yet been created. When you do Playergame.find(:all), I''m assuming they > show match_id=nil. Anyway, I''d at least try changing your script to > save Match before Playergames, and see if you''re still having > problems... > > #match.playergames << rick_game > #match.playergames << steve_game > > match.save > > #rick_game.save #this will save a game > #steve_game.save #this will save a gameGood point, about saving the games first, but I''m curious, what the heck is going on that I can''t seem to get match to save even with those game save lines commented out (as above.) I''m just trying to get a Match to save. If I call match.save and it doesn''t save shouldn''t the script throw an error? I guess that''s why I''m a little stumped since the script seems to fun just fine. When I use the rails app UI to add match it seems to save just fine as you can see by a quick call in the console:>> Match.find(:all)=> [#<Match id: 1, match_date: "2009-07-12 00:00:00", overtime: false, shootout: false, linechanges: true, period_length: 20, game_version: nil, notes: nil>] I''m sure this is going to turn out to be something really stupid, so I''m ready for the ''duh'' moment to hit me:)
Frederick Cheung
2009-Jul-13 02:14 UTC
Re: Ideas why this rake task isn''t saving one of my models?
On Jul 13, 3:02 am, Rick <ric...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Sun, Jul 12, 2009 at 9:50 PM, JangoSteve<schwartz.st...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > Good point, about saving the games first, but I''m curious, what the > heck is going on that I can''t seem to get match to save even with > those game save lines commented out (as above.) I''m just trying to get > a Match to save. > > If I call match.save and it doesn''t save shouldn''t the script throw an > error? I guess that''s why I''m a little stumped since the script seems > to fun just fine.save just returns true/false. save! throws an error One way of getting really confusing results is accidentally overwriting core active record methods (though from what you have shown so far you haven''t) Other than that, there''s always stepping through it with the debugger until you understand what''s up. Fred> > When I use the rails app UI to add match it seems to save just fine as > you can see by a quick call in the console: > > >> Match.find(:all) > > => [#<Match id: 1, match_date: "2009-07-12 00:00:00", overtime: false, > shootout: false, linechanges: true, period_length: 20, game_version: > nil, notes: nil>] > > I''m sure this is going to turn out to be something really stupid, so > I''m ready for the ''duh'' moment to hit me:)
Ah thanks Frederick. I''ll start using save! And with that, I figured it out. I had a validates_presence_of condition that wasn''t getting met. Yea a duh moment. I just figured something like would have thrown an error if there was an issue in my validate conditions. I''m glad I know about save! now. thanks. On Sun, Jul 12, 2009 at 10:14 PM, Frederick Cheung<frederick.cheung-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > On Jul 13, 3:02 am, Rick <ric...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> On Sun, Jul 12, 2009 at 9:50 PM, JangoSteve<schwartz.st...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> >> Good point, about saving the games first, but I''m curious, what the >> heck is going on that I can''t seem to get match to save even with >> those game save lines commented out (as above.) I''m just trying to get >> a Match to save. >> >> If I call match.save and it doesn''t save shouldn''t the script throw an >> error? I guess that''s why I''m a little stumped since the script seems >> to fun just fine. > > save just returns true/false. save! throws an error > > One way of getting really confusing results is accidentally > overwriting core active record methods (though from what you have > shown so far you haven''t) > > Other than that, there''s always stepping through it with the debugger > until you understand what''s up. > > Fred >> >> When I use the rails app UI to add match it seems to save just fine as >> you can see by a quick call in the console: >> >> >> Match.find(:all) >> >> => [#<Match id: 1, match_date: "2009-07-12 00:00:00", overtime: false, >> shootout: false, linechanges: true, period_length: 20, game_version: >> nil, notes: nil>] >> >> I''m sure this is going to turn out to be something really stupid, so >> I''m ready for the ''duh'' moment to hit me:) > > >-- Rick R