我想跟踪用户的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类,对吗?
答案 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