Search code examples
ruby-on-rails-3auto-update

record_timestamp = false not working from model


I want to track the last_login DateTime of my user, without changing the updated_at attribute.

So inside my Model attribut I put:

def login!(session)
    session[:user_id] = id
    User.record_timestamp = false
    self.touch(:last_login_at)
    User.record_timestamp = true
end

also tried, which is the same:

def login!(session)
    session[:user_id] = id
    self.last_login_at = Time.now
    User.record_timestamps = false
    self.save(:validate => false)
    User.record_timestamps = true
end

But update_at column still is updated after each login. It seems that User.record_timestamps = false doesn't have any effect when being called from the model directly. (I use to call this method from controller or rake tasks without any problem)

please don't tell me to use update_attribute :last_login_at, Time.now which in Rails 3.1 doesnt set the updated_at column: I'm using rails 3.0.9!

Any idea? It's really more DRY for me to do this update from the model and not from any controller...

--------------------


[edit] Hummmmmm seems like a bug in rails: I have a nested Class SubUser < User. When I replace User.record_timestamps = false by self.class.record_timestamps = false then it's working. It's quite strange because:

1) I'm calling @user.login! with a real class User (User.first.login!)

2) even if I were calling SubUser.first.login! the command User.record_timestamps should affect too SubUser class, right?


Solution

  • This is the way I did this before, please give a shot.

    def login!(session)
        session[:user_id] = id
    
        class << self
          def record_timestamps; false; end
        end
    
        self.last_login_at = Time.now
        self.save(:validate => false)
    
        class << self
          remove_method :record_timestamps
        end
    end
    

    Let me know if it helps you anyway.