将设备用户表拆分为两个表

Ish*_*wal 3 ruby ruby-on-rails devise

我有一个与 devise gem 集成的用户表。该表具有某些字段,如 current_sign_in_ip、last_sign_in_ip、current_sign_in_at 等。Devise 在用户登录时修改这些字段。我希望将这些字段移动到另一个表并通过 devise 或其他方式填充它们。有什么方法可以实现这个目标吗?

Col*_*ves 5

这个答案有两种方法:

第一个(更简单,尽管不是那么漂亮)选项是将:trackable方法委托给第二个类(下面称为 UserDetail)。例如:

class UserDetail < ActiveRecord::Base
  ...
end

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

  ...
end
Run Code Online (Sandbox Code Playgroud)

一个更干净的选择是创建一个避免覆盖 Devise 的关注点。您必须将其扩展到您的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
Run Code Online (Sandbox Code Playgroud)

我通过此链接从罗德里戈·弗洛雷斯那里得到了第二个解决方案他提醒我们像他们在这里一样把砖块record.update_tracked_fields!(warden.request)放在地上Warden::Manager.after_set_user