Forum: Ruby on Rails Objects won't destroy when inside of a loop

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Josh K. (Guest)
on 2007-07-12 19:18
(Received via mailing list)
I'm having a little trouble with this for some reason.

Can someone tell me why I can do this...

price = Price.find(5)
price.destroy

but not this...

product.prices.each do |p|
  p.destroy
end

At the end of that latter piece of code, product.prices.size still
equals 2.
For the record, I do know about delete_all, there are some
conditionals in my actual code that decide if an object gets deleted
or not. I'm just trying to figure out why my objects aren't being
destroyed when inside a loop like that.
Josh K. (Guest)
on 2007-07-12 19:31
(Received via mailing list)
I think my problem is that the relationship is a many to many. What
would be the best way to conditionally remove records this way?
Philip H. (Guest)
on 2007-07-12 20:51
(Received via mailing list)
>  p.destroy
> end
>
> At the end of that latter piece of code, product.prices.size still
> equals 2.
> For the record, I do know about delete_all, there are some
> conditionals in my actual code that decide if an object gets deleted
> or not. I'm just trying to figure out why my objects aren't being
> destroyed when inside a loop like that.

What's the database say after you do that?  And what happens if you
follow
that up with a:

product.reload

I'd be really surprised if the database wasn't adjusted after you did
that, but can see that product wouldn't know it's been updated as 'p' is
local and not really tied to 'product'.

-philip
Josh K. (Guest)
on 2007-07-12 20:59
(Received via mailing list)
Yeah, sorry about this one. my product object must have been cached
inside of the console.

It was deleting the objects from the database and when the console
was reloaded, the values were correct.
Philip H. (Guest)
on 2007-07-12 22:53
(Received via mailing list)
> Yeah, sorry about this one. my product object must have been cached
> inside of the console.
>
> It was deleting the objects from the database and when the console
> was reloaded, the values were correct.

I think the same will happen within Rails/web as well.  Try the
product.reload to see if that makes a difference.
Matthew Rudy J. (Guest)
on 2007-07-12 23:34
relations are always cached.

the first time you call "object.relations"
it goes and finds them all,

but to save on SQL queries, it caches the objects.
so next time you call "object.relations", there's no query made.

If instead you call "object.relations(true)", it'll force that relation
to be reloaded.

If you call "object.reload" it'll reload the whole object,
and then if you call "object.relations" it'll reload the relations
again.

I'd suggest

class Product
  def destroy_prices
    self.prices.each do |p|
      p.destroy
    end
    self.prices(true)
  end
end

Josh K. wrote:
> Yeah, sorry about this one. my product object must have been cached
> inside of the console.
>
> It was deleting the objects from the database and when the console
> was reloaded, the values were correct.
This topic is locked and can not be replied to.