Updating an attribute in all elements of acts_as_list


#1

I’m whipping up a basic ticketing system, and I’ve got a Ticket model
that uses acts_as_list:

class Ticket < ActiveRecord::Base

belongs_to :parent, :class_name => "Ticket", :foreign_key => 

“parent_id”
has_many :replies, :class_name => “Ticket”, :foreign_key =>
“parent_id”, :order => :position

acts_as_list :scope => :parent_id

end

It has a boolean field named resolved, and when I update it in the
parent ticket, I’d like the changes to be propogated down through the
replies. To do this, I overloaded the resolved= method:

def resolved=(r)
	super(r)
	replies.each {|reply| reply.resolved = r}
end

Here are a few assertions that all pass:
t = Ticket.find(1001)
assert !t.resolved?
t.resolved = true
assert t.resolved?
assert t.replies[0].resolved?

However, t.replies[0].parent.resolved? returns false, which makes no
sense to me, because the actual object that parent refers to returns
true.

If I save and reload the parent ticket, t.replies[0].resolved? returns
false. Okay, this makes sense because I didn’t save each individual
ticket. So I created a new method, Ticket.resolve, which takes the
place of resolved=

def resolve
	setresolved(true)
end

protected
def setresolved(status)
	Ticket.transaction(self, self.replies) do
		self.resolved = status
		puts self.resolved?
		replies.each {|r| r.resolved = status}
	end
end

I get the exact same deal if I use this instead…t.resolved? and
t.replies[0].resolved? return true before the reload, but if I reload
the t object then replies[0].resolved? returns false.

I don’t really know what to try anymore. First of all, I’m confused
how t.resolved? could be true and t.replies[0].parent.resolved? could
be false, since they’re the same object. Secondly, I’d just like to
be able to update the ‘resolved’ attribute in all the children of the
root object.

Thanks for taking the time to read all this, I’d appreciate any help.

Pat