12

में प्रतिनिधि विधि के लिए तर्क कैसे पारित करें मैं कई मॉडलों के सारांश को प्रदर्शित करने के लिए डैशबोर्ड रखना चाहता हूं, और मैंने इसे अपने डेटा के बिना प्रेजेंटर का उपयोग करके कार्यान्वित किया। मैं एक ActiveModel वर्ग (डेटा तालिका के बिना) का उपयोग करें:रेल

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 साथ खाते से पता विशेषता लौट जाना होगा डैशबोर्ड उदाहरण में to user_id के बराबर होती है)।

लेकिन डैशबोर्ड एक ActiveRecord वर्ग नहीं है, इसलिए मैं belongs_to घोषित नहीं कर सकता। मुझे सही रिकॉर्ड देखने के लिए खाता बताने का एक और तरीका चाहिए।

क्या इस समस्या को दूर करने का कोई तरीका है? (मुझे पता है कि मैं एक खाली टेबल रखने के लिए नकली डैशबोर्ड कर सकता हूं, या मैं उपयोगकर्ता के उदाहरण विधियों को कक्षा विधियों के लिए फिर से लिख सकता हूं जो तर्क लेते हैं। लेकिन ये समाधान सभी हैक्स हैं)।

धन्यवाद।

+0

यह बहुत समझ में नहीं आता है। 'आईडी' क्या है? क्या यह एक संख्या माना जाता है? (आप '(" 123 ") नहीं भेज सकते हैं, यह मान्य विधि नाम नहीं है।) आप' attr_accessor: user_id' के साथ 'Dashboard.user_id' का उपयोग नहीं कर सकते, एक वर्ग है और दूसरा उदाहरण है। .. कृपया स्पष्ट करें और उदाहरण दें कि आप इसे कैसे काम करने की उम्मीद करते हैं। –

+0

हाय एंडी, हो सकता है कि मैं पर्याप्त स्पष्ट न हो। कृपया ध्यान दें कि यह एक नियमित ActiveRecord :: बेस क्लास नहीं है। इसलिए, मुझे current_user की आईडी पकड़ने के लिए एक विशेषता की आवश्यकता है। (हालांकि मैं इस आईडी को स्थायी रूप से नहीं रखना चाहता)। प्रतिनिधि द्वारा, मैं डैशबोर्ड.ड्रेस को कॉल करने में सक्षम होना चाहता हूं और खाता वापस भेजना चाहता हूं। Find_by_user_id (Dashboard.user_id) .address। मैंने इस फ़ंक्शन को खाता वर्ग में प्रतिनिधि करने का प्रयास किया, लेकिन मुझे किसी भी तरह से user_id मान को खाते में पास करने की आवश्यकता है, ताकि यह पता चले कि किस खाते के उदाहरण के साथ काम करना चाहिए। – AdamNYC

उत्तर

10

जब आप delegate :address, :to => :account लिखते हैं, यह जो मूल रूप से एक ही वस्तु पर account प्रणाली को बुलाती है डैशबोर्ड पर एक नया address विधि बनाता है और फिर इस account विधि के परिणाम पर address कहता है। यह (बहुत मोटे तौर पर) लेखन के लिए समान है:

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 

यह:

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

अपने वर्तमान वर्ग के साथ, आपको क्या करना है एक account विधि है जो सही user_id के साथ खाता रिटर्न बनाने के लिए है आपको इस तरह के पते तक पहुंचने की अनुमति होगी:

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

धन्यवाद बेनोइट। यही वही है जो मैं ढूंढ रहा हूं। – AdamNYC

+0

@AdamNYC अगर आपको उपरोक्त कोड के बारे में कोई संदेह है तो स्पष्टीकरण मांगने में संकोच न करें, मैं खुशी से अतिरिक्त स्पष्टीकरण डालूंगा। –