after_create not being called in seeds.rb?

Hello,

I'm using the seeds.rb to create some user records:
100.times do
  user = User.new
  user.username = Faker::Name.first_name
  user.email = user.username+"@example.com"
  user.save!
end

This works just fine and the users have been created after I ran
db:seeds but what's not working is:

after_create :write_comments

protected
def write_comments
  comment = Comment.new
  comment.text = "some text"
  comment.user = self
  comment.save!
end

There's not one single comment in the database but when I create a user
using the console the comment is created after I save the user.

Anyone knows what's wrong here?

i think self is a reserved word! shouldnt it be current_user?

Heinz Strunk wrote:

Hello,

I'm using the seeds.rb to create some user records:
100.times do
  user = User.new
  user.username = Faker::Name.first_name
  user.email = user.username+"@example.com"
  user.save!
end

This isn't directly a solution to your problem, but...

Is this for testing? If so, I recommend using factories, not seeds.
seeds.rb is for application seed data (such as tables of countries or
shipping rates), not what you're apparently doing here.

...but why do your tests need 100 records to begin with? Normally, you
should just call the factory within each test to create the (1 or 2)
records you need for that test.

Best,

@brito: self always worked cause it's the instance of the current object
which I wanna use so that should be fine.

@Marnen: Actually they're not really users but NPCs which I need for
various things and I need a lot of them to populate the world.

Therefore it's not for test but to populate and I don't think factories
are good for so many objects, right?

Please quote when replying; otherwise, it gets difficult to follow the
discussion.

Heinz Strunk wrote:

@Marnen: Actually they're not really users but NPCs which I need for
various things and I need a lot of them to populate the world.

Therefore it's not for test but to populate

So this is actual production data?

and I don't think factories
are good for so many objects, right?

Factories should be fine for creating so many objects -- but they're not
for creating production data.

If it's production data, create it all and use seeds.
If it's test data, create only the few records you need and use
factories.

[and, from earlier post]

This works just fine and the users have been created after I ran
db:seeds but what's not working is:

after_create :write_comments

protected
def write_comments
comment = Comment.new
comment.text = "some text"
comment.user = self
comment.save!
end

It's not appropriate to use an after_create for this sort of thing, I
think. In your 100.times block, just create a comment when you create
each user.

Best,

Marnen Laibow-Koser wrote:

Please quote when replying; otherwise, it gets difficult to follow the
discussion.

So this is actual production data?

Yes, it is.

It's not appropriate to use an after_create for this sort of thing, I
think. In your 100.times block, just create a comment when you create
each user.

Makes sense for comments but there but there's stuff like attributes
etc. which needs to be created even when a user is created from the web
interface. Do you know why the code above doesn't work?

after_create :write_comments

protected
def write_comments
  comment = Comment.new
  comment.text = "some text"
  comment.user = self
  comment.save!
end

There's not one single comment in the database but when I create a
user using the console the comment is created after I save the user.

Is the after_create callback ever executed? Add a puts to make sure.

Anyone knows what's wrong here?

I wouldn't write code like that to begin with. This is much nicer:

def write_comments
  user.comments.create!(:text => 'some text')
end

Michael

For some stupid reason it's working now. My guess is a Windows reboot
did the magic :wink: It is indeed much nicher!

Thanks everybody!

jojo, now i see what you are doing, is just that i didnt saw the after create the first time, you are using the self reserved word indeed to refer to the created user in the after create, have you tried that before? why not put the function in the loop after the user.save ?

i imagine that that it fail quietly?

put the function in the loop after the user.save ?

What exactly do you mean by put it in the loop after .save?

sorry now i see it makes no sense, i understood that this is all in your seed.rb and both functions will only be used once and i was suggesting this

100.times do
user = User.new
user.username = Faker::Name.first_name
user.email = user.username+"@example.com"
user.save!
write_comments(user) <=== this could be in your controller create action
end

protected
def write_comments(user)
comment = Comment.new
comment.text = “some text”
comment.user = user
comment.save!
end

After paying more attention to your comment i notice you want the write_comments to be in your model in production, and my suggestion made no sense.

Ah, I see. Yeah, after_create seems better after all.