假设我有一个名为Home wich belongs_to User的模型。
鉴于主对象@home
,我目前正在访问以下几个用户属性:
@home.user.name
@home.user.phone
原来有些用户属性我不想让任何正在使用Home实例的用户访问。反正有没有在Rails中完成它?
示例:
如果我尝试@home.user.name
失败,但如果我有一个用户对象(@user
),则@user.name
本身不会失败。
这背后的原因是用户有一些不应该存在的属性,我想逐渐将它们从那里删除,并将它们放入家中。我想避免代码的其他用户认为他们仍然可以通过user
访问这些属性,这就是我想失败的原因。
答案 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模型对象可能是一个不错的选择。