2010-11-09 97 views
2

我有兩個通過has_many/belongs_to關聯的模型。我在子模型中創建了一個類方法。但我無法弄清楚如何從類方法中訪問父模型的實例方法。這裏是什麼,我試圖做一個簡化:如何在Rails中訪問父模型的實例變量?

#User model 
class User < ActiveRecord::Base 
    has_many :addresses 

    def first_name 
     "John" 
    end 

    def last_name 
     "Doe" 
    end 
end 

#Address model 
class Address < ActiveRecord::Base 
    belongs_to :user 

    def self.full_name 
     parent.first_name + " " + parent.last_name 
     #returns full name of parent "John Doe" 
    end 
end 

我希望能夠在Rails的控制檯上運行這一點,並使其返回「李四」 ......但沒有運氣。有什麼建議麼?

@user = User.first 
@user.addresses.full_name 

回答

0
@user.addresses.full_name 

所以你需要選擇從所述陣列中的單個對象時,此返回一個數組,假設陣列不爲空。

@user.address.first.full_name 

這實現了什麼?因爲你可以得到完整的名字從用戶對象的,它不應該改變基於地址:(

class User < ActiveRecord::Base 
    has_many :addresses 

    def first_name 
     "John" 
    end 

    def last_name 
     "Doe" 
    end 

    def full_name 
     self.first_name + " " + self.last_name 
    end 
end 

所以,現在你可以從@user對象訪問full_name

@user.full_name 
+1

對,我知道我可以在用戶模型本身中定義full_name。我想要做的是弄清楚如何從一個孩子內部訪問父方法。 – Chanpory 2010-11-09 01:41:50

+0

我將問題簡化爲用戶/地址模式,以便於進行響應。我真正的問題涉及用戶模型和活動模型。 Activity模型由外部soap資源支持。我試圖做一個方法,我可以通過訪問user.user_id中的user_id來調用user.activities.refresh來獲取SOAP資源。我希望能夠做到這一點,如果活動數組是空的。 – Chanpory 2010-11-09 01:46:55

+0

如果你想從孩子內部訪問父方法,你已經知道父方法,所以只需調用父方法。我很明顯困惑,並沒有得到你想要的東西:) – s84 2010-11-09 02:00:01

0

你感到困惑使用實例方法的類繼承,以及使用實例方法的類方法

在「def self.full_name」中丟失「self」 - 它沒有按照你的想法做,然後用「user」代替「parent」。爲您提供ActiveRec的參考ord :: Base,它與你定義的關係無關。 「用戶」會給你那個特定地址的用戶對象,這可能是你正在尋找的東西。

上一個答案已經進入爲什麼你不能在@ user.addresses上調用「full_name」。

+0

謝謝,這有助於解釋爲什麼父母不工作,因爲它引用了ActiveRecord :: Base。然而,如果我在Address中定義了一個類方法,我仍然想知道如何引用User實例方法。例如,如果我有一個用戶實例作爲@user,並且我想調用@ user.addresses.fetch_from_soap從外部SOAP源中爲名爲「John Doe」的用戶提取地址?我該怎麼做? – Chanpory 2010-11-09 05:54:18

+0

等待,如果您從fetch_from_soap的SOAP源中獲取地址,爲什麼還要調用@ user.addresses?調用@ user.addresses將查詢數據庫的地址,其中[email protected]並返回一組匹配的Address對象。你是否將你的地址存儲在數據庫和SOAP服務器中? – bioneuralnet 2010-11-09 14:34:00

+0

我正在提取並保存對Rails數據庫的SOAP響應,以便應用程序不必向SOAP服務器發出儘可能多的請求,這會減慢應用程序的運行速度。 @ user.addresses將訪問數據庫中的所有本地地址。 @ user.addresses.fetch_from_soap將獲取新地址並將其與數據庫合併。我將fetch_from_soap方法作爲address.rb中的類方法。也許不是最好的地方?我想去http://www.mysite.com/users/1/addresses/fetch_from_soap調用fetch_from_soap方法,並將user_id作爲SOAP請求的一部分傳遞。 – Chanpory 2010-11-09 16:32:47