record_timestamp = false不在模型中工作

时间:2012-02-26 15:46:20

标签: ruby-on-rails-3 auto-update

我想跟踪用户的last_login DateTime,而不更改updated_at属性。

所以在我的模型属性中,我把:

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

也尝试了,这是一样的:

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

但每次登录后仍会更新update_at列。 从模型直接调用时,似乎User.record_timestamps = false没有任何影响。 (我用来从控制器或rake任务调用这个方法没有任何问题)

请不要告诉我使用update_attribute:last_login_at,Time.now在Rails 3.1中没有设置updated_at列:我正在使用rails 3.0.9!

有什么想法吗? 从模型而不是从任何控制器进行更新对我来说真的更干......

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


[编辑] Hummmmmm似乎是rails中的一个bug:我有一个嵌套的Class SubUser<用户。 当我用self.class.record_timestamps = false替换User.record_timestamps = false时,它正在工作。这很奇怪,因为:

1)我正在调用@ user.login!与真正的类User(User.first.login!)

2)即使我正在调用SubUser.first.login!命令User.record_timestamps也会影响SubUser类,对吗?

2 个答案:

答案 0 :(得分:1)

这是我以前做过的方式,请试一试。

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

让我知道它是否对你有所帮助。

答案 1 :(得分:0)

我会尝试使用update_attribute,因为它没有进行验证,所以也许它不会更新时间戳。我不确定它是否会起作用:

def login!(session)
    update_attribute :last_login_at, Time.now
end