禁止访问特定的关联对象字段

时间:2016-02-29 17:58:57

标签: ruby-on-rails associations

假设我有一个名为Home wich belongs_to User的模型。

鉴于主对象@home,我目前正在访问以下几个用户属性:

@home.user.name
@home.user.phone

原来有些用户属性我不想让任何正在使用Home实例的用户访问。反正有没有在Rails中完成它?

示例:

如果我尝试@home.user.name失败,但如果我有一个用户对象(@user),则@user.name本身不会失败。

这背后的原因是用户有一些不应该存在的属性,我想逐渐将它们从那里删除,并将它们放入家中。我想避免代码的其他用户认为他们仍然可以通过user访问这些属性,这就是我想失败的原因。

1 个答案:

答案 0 :(得分:0)

使用ActiveRecord开箱即可。

执行此操作的一种方法是覆盖Home类上的#user方法,而不是返回原始用户模型,返回包装用户模型的代理对象,并仅委托给属性访问器你指定。如下所示:

class Home < ActiveRecord::Base
  belongs_to :user

  def user
    UserProxy.new(user)
  end
end

class UserProxy
  # only methods you specifically delegate will be 
  delegate :screen_name, to: :user
   def initialize(user)
     @user = user
   end

   private
   attr_reader :user
end

话虽如此,我不推荐它。从广义上讲,覆盖AR生成的方法可能会随着需求的变化和变化而导致长期的痛苦。

如果限制属性访问更多是您的视图级关注,而不是模型级关注,那么使用presenter / view模型对象可能是一个不错的选择。