【问题标题】:Splitting devise users table into two tables将设计用户表拆分为两个表
【发布时间】:2015-12-29 12:30:16
【问题描述】:

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

【问题讨论】:

  • devise :trackable 到您必须转移字段的模型

标签: ruby-on-rails ruby devise


【解决方案1】:

这个答案有两种方法:

第一个(也更简单,虽然不那么漂亮)选项是将: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. 从 Rodrigo Flores 那里得到了第二个解决方案,他提醒我们像 here. 一样将 record.update_tracked_fields!(warden.request) 放在 Warden::Manager.after_set_user 块上

【讨论】:

  • 非常感谢您的回答。当然,它帮助了我。不过,我想提一下我最终是如何做到的。我没有使用委托,因为我希望我的 User 模型和 UserLogs 模型之间存在一对多的关系,并且我希望 user_logs 表是一个仅插入表。所以,我根据它覆盖了设计 update_tracked_fields 。再次感谢。
【解决方案2】:

感谢您的回复。它帮助我朝着正确的方向前进。 让我分享一下我是如何解决我所面临的问题的。

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

所以:

  1. 我创建了一个新的 user_logs 表和 UserLog 模型。

  2. 重写 update_tracked_fields 方法以每次在 user_logs 表中实际插入一个新行,而不是更新 users 表。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2010-09-27
    相关资源
    最近更新 更多