2015-12-29 60 views
1

我有一个用户表与设计宝石集成在一起。该表具有诸如current_sign_in_ip,last_sign_in_ip,current_sign_in_at等的某些字段。当用户登录时,设计会修改这些字段。 我希望将这些字段移动到另一个表并通过设计或其他方式填充它们。有没有办法实现这一目标?将用户表分成两个表

+0

'色器件:trackable'该模型,你必须传递领域 –

+0

这并不工作。 –

回答

3

有两种方法,以这样的回答:

第一个(也是更容易,虽然没有漂亮的)选项是委托:trackable方法,第二类(下文称为UserDetail)。例如:

class UserDetail < ActiveRecord::Base 
    ... 
end 

class User < ActiveRecord::Base 
    delegate :current_sign_in_ip, :last_sign_in_ip .... to: :user_detail 

    ... 
end 

一个清洁的选择是创建一个压倒一切避免制定一个问题。你必须在扩展这个你User型号:

module Trackable 
    def update_tracked_fields!(request) 
    old_current, new_current = user_detail.current_sign_in_at, Time.now.utc 
    user_detail.last_sign_in_at  = old_current || new_current 
    user_detail.current_sign_in_at = new_current 

    old_current, new_current = self.current_sign_in_ip, request.ip 
    user_detail.last_sign_in_ip  = old_current || new_current 
    user_detail.current_sign_in_ip = new_current 

    user_detail.sign_in_count ||= 0 
    user_detail.sign_in_count += 1 

    user_detail.save(:validate => false) 
    end 
end 

我通过this link.得到了罗德里戈弗洛雷斯第二个解决方案,他提醒我们把record.update_tracked_fields!(warden.request)Warden::Manager.after_set_user块像他们这样做here.

+0

如果有帮助,请随时接受我的回答! –

+0

非常感谢您的回答。当然,它帮助了我。尽管如此,我想提一下我最终如何去做。我没有使用委托,因为我想在我的User模型和UserLogs模型之间建立一对多的关系,并且我希望user_logs表是一个只能插入的表。所以,我根据它重写了设备update_tracked_fields。再次感谢。 –

0

感谢上响应。它帮助我朝着正确的方向前进。 让我分享我如何解决我面临的问题。

由于我想要用户和user_logs表之间的一对多关系,我无法将可跟踪的方法委托给UserLog模型。 另外,我希望user_logs表是一个只能插入的表,因此我需要相应地覆盖Devise Trackable模块的update_tracked_fields方法。

所以:

  1. 我创建了一个新的user_logs表和用户日志模式。

  2. 覆盖update_tracked_fields方法,每次在user_logs表中实际插入新行,而不是更新用户表。

  3. 为用户模型中的这些可跟踪字段创建getter方法,该方法实际上从user_logs表中获取所需的列值。就像这样:

    self.try(:user_logs).last.try(:current_sign_in_ip)