使用具有单表继承的私有方法

时间:2015-02-20 16:41:51

标签: ruby-on-rails ruby single-table-inheritance private-methods

我正在使用rails应用程序,我有2种不同类型的用户(MasterClientUser和AccountManager)。我使用单表继承来区分用户。我有一个update_last_seen_at私有方法,需要在AccountManager和MasterClientUser上调用。我试图将它放在用户模型中,但我收到以下错误:

private method `update_last_seen_at' called for #<MasterClientUser:0x007fc650d2cad0>

从HomeController调用update_last_seen_at方法:

class HomeController < ApplicationController

  before_action :authenticate_user!, :save_users_access_time, only: [:index]

  def index
    @user = current_user
  end

  def save_users_access_time
    current_user.update_last_seen_at
  end

end

模型

class User < ActiveRecord::Base
end

class MasterClientUser < User

  private

  def update_last_seen_at
    self.update_attributes(last_seen_at: Time.now)
  end

end

class AccountManager < User
end

我也尝试将该方法放在一个模块中,并将模块包含在每个不同的User类型中,但是我得到了同样的错误。

有没有办法可以为两种用户类型共享方法并将其保密,而不必明确地将它们放在每个模型中?/是否有更好的策略来解决这个问题。

2 个答案:

答案 0 :(得分:1)

def save_users_access_time
  current_user.update_last_seen_at
end

您无法在自己的用户类之外调用私有方法,这就是您遇到问题的原因,您可以将该方法更改为普通的公共方法

无论如何,我实际上认为整个方法都是不必要的,如果他们要做的就是更新last_seen_at字段,你可以考虑改用touch

def save_users_access_time
  current_user.touch(:last_seen_at)
end

答案 1 :(得分:-1)

在User类中将方法定义为受保护的方法,即让派生类使用它。我认为对方法类型的一个好的(一般)解释是这样的:What is the difference between Public, Private, Protected, and Nothing?,希望它对你有帮助。

虽然红宝石只支持这个:

Ruby为您提供了三个级别的可访问性:

  1. 每个人都可以调用公共方法 - 不强制执行访问控制。类的实例方法(这些方法不仅属于一个对象;相反,类的每个实例都可以调用它们)默认是公共的;有人可以打电话给他们initialize方法始终是私有的。
  2. 受保护的方法只能由定义类及其子类的对象调用。访问权归家庭所有。但是,受保护的使用是有限的。
  3. 使用显式接收器无法调用私有方法 - 接收方始终是自己的。这意味着只能在当前对象的上下文中调用私有方法;你不能调用另一个对象的私有方法。