always the method is the madness...

OK - I don't understand this - and it doesn't seem to help to add self
to this.

I have a personnel.rb model.

There is a definition in this model...

  def doh_anniversary
    x = 1
    while doh.to_date + ( 365 * x ) <= Time.now.to_date
      x += 1
    end
    doh + ( 365.25 * x ).floor
  end

where doh is an actual column (date of hire)

In my view code, this worked...
<%= @personnel.doh_anniversary %>

but now I am putting it into a loop...

<% for personnel in @personnel %>
<%= personnel.doh_anniversary %>
<% end %>

and that gets me an error - undefined method doh.anniversary

and defining it as

  def self.doh_anniversary
    x = 1
    while self.doh + (365 * x ) <= Time.now.to_date
    ...
    or
    while doh + ...

still returns the same undefined method error

Any hints on how to make happy method and less madness?

Craig

<snip>

In my view code, this worked...
<%= @personnel.doh_anniversary %>

but now I am putting it into a loop...

<% for personnel in @personnel %>
<%= personnel.doh_anniversary %>
<% end %>

If this is in the same view, it is understandable.

If @personnel is a single Personnel instance, acquired with
Personnel.find(some_id), then the for loop won't work. If @personnel
in the second example comes from something like Personnel.find(:all,
some_query), then try the following.

Try rendering the class name of the personnel variable in the loop:

<%= personnel.class.name %> and let us know what you get.

Cheers,
Max

Adding “self” is definitely not the right thing - doh_anniversary uses the values from a particular
instance, not the Personnel class.

I’m concerned about the error message quoted above - if it that’s the message, than your view
code has swapped . and _ - which would obviously be trouble… Make sure you’re really saying
personnel.doh_anniversary
and not personnel.doh.anniversary (which tries to call a method
named “anniversary” on the “doh” value).

And just to be pedantic, I don’t think the loop in doh_anniversary
is really what you want
anyway. From the name of the function, it seems that you’re looking to calculate the
next anniversary of a particular date. This should work pretty much the same:

def doh_
anniversary(doh)
d = Date.new(Date.today.year, doh.month, doh.mday)
d = Date.new(Date.today.year+1, doh.month, doh.mday) if d < Date.today
d
end

Two notes on the above new code:
(1) It dies rather painfully if doh is on a leap day (2/29) - you may need to rescue from

that exception if that’s important to you.
(2) It returns today’s date if the anniversary is today. Change the < to a <= if that’s not
what you want.

Hope this helps,

<snip>
>
> In my view code, this worked...
> <%= @personnel.doh_anniversary %>
>
> but now I am putting it into a loop...
>
> <% for personnel in @personnel %>
> <%= personnel.doh_anniversary %>
> <% end %>
>
If this is in the same view, it is understandable.

If @personnel is a single Personnel instance, acquired with
Personnel.find(some_id), then the for loop won't work. If @personnel
in the second example comes from something like Personnel.find(:all,
some_query), then try the following.

Try rendering the class name of the personnel variable in the loop:

<%= personnel.class.name %> and let us know what you get.