Auto_increment model method wont increment but no error?

Hi, i'm trying to get my ChrissMonster model to pull back the value of
"eat" in the chriss_monster table and increment the value by 1.

Here's my controller function:

def feed
  @chriss_monster = ChrissMonster.find(params[:id])
  @chriss_monster.feed
  redirect_to :action => 'list'
end
<<<

Here's my model:

class ChrissMonster < ActiveRecord::Base
  def feed
    ChrissMonster.increment_counter :eat, :id
  end
end
<<<

When I call the controller function, it directs me back to the list
page, it doesn't give me an error, and it does NOT increment the "eat"
value.

What am I doing wrong? How else could I rewrite this?

Thanks for reading!

--Dan W.

The problem is in your model. My assumption is that your database
table for ChrissMonster has an 'eat' column and an 'id' column with
'id' being the primary key. It looks like your trying increment the
'eat' counter.

class ChirssMonster < ActiveRecord::Base
  def feed
    ChrisMonster.increment_counter 'eat', self['id']
  end
end

This might work. The difference is that I'm telling active record to
increment the 'eat' couonter for the record that has the primary key
of self['id'] -- the id of the record on which the feed method was
invoked.

A shorter version that might work ...

class ChrissMonster < ActiveRecord::Base
  def feed
    increment!( 'eat' )
  end
end

That's all I got. Try posting this question on the ruby on rails list.
They are a lot smarter about rails over there.

Blessings,
TwP

···

On 10/25/06, Dan W. <wozniak.dan@gmail.com> wrote:

Hi, i'm trying to get my ChrissMonster model to pull back the value of
"eat" in the chriss_monster table and increment the value by 1.

Here's my controller function:
>>>
def feed
  @chriss_monster = ChrissMonster.find(params[:id])
  @chriss_monster.feed
  redirect_to :action => 'list'
end
<<<

Here's my model:
>>>
class ChrissMonster < ActiveRecord::Base
  def feed
    ChrissMonster.increment_counter :eat, :id
  end
end
<<<

When I call the controller function, it directs me back to the list
page, it doesn't give me an error, and it does NOT increment the "eat"
value.

What am I doing wrong? How else could I rewrite this?

Dan W. wrote:

Hi, i'm trying to get my ChrissMonster model to pull back the value of
"eat" in the chriss_monster table and increment the value by 1.

Here's my controller function:
  def feed
  @chriss_monster = ChrissMonster.find(params[:id])
  @chriss_monster.feed
  redirect_to :action => 'list'
end
<<<
  

Wouldn't you need a @chriss_monster.save in there somewhere?

-Doug Seifert

Dan,

Your schema/model need work. What you need to do is retrieve the value of
eat that corresponds with the param[:id] increment it (within your code [eat
+= 1;]), and then store it back to the DB. Else what might be going on is
that you're telling the DB to create a new record with the counter and eat
incremented. There's no point in having the field eat to auto_increment if
it's not going to be a key of the relation. That is, eat will not uniquely
identify the row, thus you should not have it as an implicit key. If you
don't want to write one more line of code in your code...you can write 6
lines and create a stored procedure in the DB (if your DB supports it) :wink:

Peace,
Ruben

···

On 10/25/06, Tim Pease <tim.pease@gmail.com> wrote:

On 10/25/06, Dan W. <wozniak.dan@gmail.com> wrote:
> Hi, i'm trying to get my ChrissMonster model to pull back the value of
> "eat" in the chriss_monster table and increment the value by 1.
>
> Here's my controller function:
> >>>
> def feed
> @chriss_monster = ChrissMonster.find(params[:id])
> @chriss_monster.feed
> redirect_to :action => 'list'
> end
> <<<
>
> Here's my model:
> >>>
> class ChrissMonster < ActiveRecord::Base
> def feed
> ChrissMonster.increment_counter :eat, :id
> end
> end
> <<<
>
> When I call the controller function, it directs me back to the list
> page, it doesn't give me an error, and it does NOT increment the "eat"
> value.
>
> What am I doing wrong? How else could I rewrite this?
>

The problem is in your model. My assumption is that your database
table for ChrissMonster has an 'eat' column and an 'id' column with
'id' being the primary key. It looks like your trying increment the
'eat' counter.

class ChirssMonster < ActiveRecord::Base
  def feed
    ChrisMonster.increment_counter 'eat', self['id']
  end
end

This might work. The difference is that I'm telling active record to
increment the 'eat' couonter for the record that has the primary key
of self['id'] -- the id of the record on which the feed method was
invoked.

A shorter version that might work ...

class ChrissMonster < ActiveRecord::Base
  def feed
    increment!( 'eat' )
  end
end

That's all I got. Try posting this question on the ruby on rails list.
They are a lot smarter about rails over there.

Blessings,
TwP

Dan, take a look at the documentaiton on the ActiveRecord "increment!"
method. I think this does what you just described.

Blessings,
TwP

···

On 10/26/06, Ruben D. Orduz <aminox@gmail.com> wrote:

Dan,

Your schema/model need work. What you need to do is retrieve the value of
eat that corresponds with the param[:id] increment it (within your code [eat
+= 1;]), and then store it back to the DB. Else what might be going on is
that you're telling the DB to create a new record with the counter and eat
incremented. There's no point in having the field eat to auto_increment if
it's not going to be a key of the relation. That is, eat will not uniquely
identify the row, thus you should not have it as an implicit key. If you
don't want to write one more line of code in your code...you can write 6
lines and create a stored procedure in the DB (if your DB supports it) :wink:

I thought something along these lines also, but looking at the
documentation for increment_all
http://rubyonrails.org/api/classes/ActiveRecord/Base.html#M000871

and following the source code looks like it will run a SQL query something like

    UPDATE ChrissMonsters SET eat = eat + 1 WHERE id = self_id;

where self_id is the id of the particular instance. Notice that
increment_all is a class method of ActiveRecord::Base

So it SHOULD act like

   self.increment_counter(:eat)

Not sure why it doesn't seem to be.

···

On 10/26/06, Ruben D. Orduz <aminox@gmail.com> wrote:

Dan,

Your schema/model need work. What you need to do is retrieve the value of
eat that corresponds with the param[:id] increment it (within your code [eat
+= 1;]), and then store it back to the DB.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

OOPS, that should have been

   So it SHOULD act like

      self.increment_counter!(:eat)

···

On 10/26/06, Rick DeNatale <rick.denatale@gmail.com> wrote:

So it SHOULD act like

   self.increment_counter(:eat)

Not sure why it doesn't seem to be.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

IPMS/USA Region 12 Coordinator
http://ipmsr12.denhaven2.com/

Visit the Project Mercury Wiki Site
http://www.mercuryspacecraft.com/