Forum: Ruby on Rails Interesting Class variable problem

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.
Commander J. (Guest)
on 2009-04-28 02:49
(Received via mailing list)
class PostOfTheDay
  private

  def self.current_day
    DateTime.now.utc.to_date
  end

  @@current_post = nil
  @@current_day = current_day

  def self.get_random_post
    posts = Post.all

    posts[rand(posts.size)]
  end

  public

  def self.fetch
    if @@current_post.nil? || @@current_day != current_day
      @@current_post = get_random_post
      @@current_day = current_day
    end

    return @@current_post
  end
end

I would expect the class variables @@current_post and @@current_day to
never
change when not accessed. However, in development mode, on each request,
a
different Post is returned because either the Klazz has been garbage
collected (?) or the initializers

@@current_post = nil
@@current_day = current_day

have been re-run. But isn't it required to initialize a class variable
before usage?

Why is this the default behaviour? Any pointers on a different approach?
Frederick C. (Guest)
on 2009-04-28 11:00
(Received via mailing list)
On Apr 27, 11:49 pm, Commander J. <removed_email_address@domain.invalid>
wrote:
>   def self.get_random_post
>       @@current_day = current_day
>
In development mode classes are cleaned out and loaded from scratch on
each request (this is why you don't need to restart the server to see
changes. In production this isn't true.

Fred
Commander J. (Guest)
on 2009-04-28 21:17
(Received via mailing list)
Thanks, I just read http://www.ruby-forum.com/topic/133234 which is also
very clear.

I'll just store that Post of the Day inside an ActiveRecord model.

On Tue, Apr 28, 2009 at 8:59 AM, Frederick C. <
This topic is locked and can not be replied to.