2011-09-24 92 views
12

我想要一個Dashboard來顯示多個模型的摘要,並且我使用Presenter實現了它,但沒有自己的數據。我使用一個類加載ActiveModel(無數據表):如何將參數傳遞給Rails中的委託方法

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

end 

通過委託,我希望能夠調用Dashboard.address並取回Account.find_by_user_id(Dashboard.user_id).address

如果儀表板是一個ActiveRecord類,那麼我可以宣佈Dashboard#belongs_to :account和代表將工作自動(即客戶會知道它應該從帳戶返回地址屬性與user_id在Dashboard例如等於to user_id)。

但儀表板不是ActiveRecord類,所以我不能聲明belongs_to。我需要另一種方式告訴帳戶查找正確的記錄。

有沒有辦法解決這個問題? (我知道我可以假裝儀表板有一個空表,或者我可以將用戶的實例方法重寫爲需要參數的類方法,但這些解決方案都是黑客)。

謝謝。

+0

這沒有多大意義。什麼是'id'?這應該是一個數字嗎? (你不能'發送(「123」)',這不是一個有效的方法名稱。)你不能使用'Dashboard.user_id'和'attr_accessor:user_id',一個是類,另一個是實例。 ..請澄清並舉例說明你如何期望這項工作。 –

+0

嗨安迪,可能我不夠清楚。請注意,這不是一個常規的ActiveRecord :: Base類。因此,我需要一個屬性來保存current_user的id。 (我不想永久保留這個ID)。通過委託,我希望能夠調用Dashboard.address並獲取Account.find_by_user_id(Dashboard.user_id).address。我試圖將此函數委託給Account類,但我需要以某種方式將user_id值傳遞給Account,以便它知道應該使用哪個帳戶實例。 – AdamNYC

回答

10

當你寫delegate :address, :to => :account,這造成儀表盤上的一個新address方法基本上調用同一個對象的account方法,然後在此account方法的結果調用address。這是(非常粗略地)類似於寫作:

class Dashboard 
... 
    def address 
    self.account.address 
    end 
... 
end 

根據您當前的類,所有你所要做的就是創建一個account方法,用正確的user_id返回帳戶:

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

    def account 
    @account ||= Account.find_by_user_id(self.user_id) 
    end 
end 

這將允許你訪問這樣的地址:

dashboard = Dashboard.new(1) 
# the following returns Account.find_by_user_id(1).address 
address = dashboard.address 
+0

謝謝Benoit。這正是我正在尋找的。 – AdamNYC

+0

@AdamNYC如果您對上述代碼有任何疑問,請不要猶豫,以澄清問題,我會很樂意提供更多解釋。 –