2016-02-29 65 views
1

假設我有一個名爲Home的模型belongs_to User。禁止訪問特定的關聯對象字段

給定一個主對象,@home,我目前訪問多個用戶屬性是這樣的:

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

原來有一些用戶屬性,我不希望任何人誰佔用了家庭實例訪問。無論如何要在Rails中實現這一點?

例子:

如果我嘗試做@home.user.name失敗了,但如果我有一個用戶對象(@user),本身@user.name不應該失敗。

這個背後的推理是,用戶的某些屬性不應該存在,我想逐漸從那裏刪除它們,並將它們放入家中。我想避免代碼的其他用戶認爲他們仍然可以通過user訪問這些屬性,這就是爲什麼我想失敗。

+0

我不認爲有可能這樣做。由於@ home.user將返回用戶對象本身。因此,我們將無法區分普通用戶對象和我們使用'@ home.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的方法可能會隨着需求的演變和變化而導致長期的痛苦。

如果限制屬性訪問更多的是關注您的視圖級別的問題,而不是模型級別的問題,那麼使用展示器/視圖模型對象可能非常適合。

+0

定義用戶方法時,您會遇到堆棧級別太深的錯誤嗎?它會繼續調用自己。 –