2010-09-17 11 views
7

मैं एक रेल एप्लिकेशन का निर्माण कर रहा हूं जो लेखांकन कार्यक्षमता करता है। इस के हिस्से के रूप में, मेरे पास कक्षा का नाम Transaction है। अब तक इतना अच्छा है, मैं इस कार्यक्षमता को एक महीने या उससे भी अधिक समय तक बना रहा हूं, और सबकुछ अपेक्षित के रूप में काम कर रहा है।रेल अनुप्रयोग में कक्षा नाम संघर्ष को हल करना

अब तक ...

मैं सिर्फ कुछ पुराने रिपोर्टिंग कार्यक्षमता महीने पहले विकसित किया गया था Ruport पुस्तकालय काम कर बंद कर दिया है का उपयोग करते हुए खोज की है। ऐसा प्रतीत होता है कि पीडीएफ उत्पन्न करते समय रुपोर्ट को पुस्तकालय की आवश्यकता होती है जिसमें Transaction नामक कक्षा/मॉड्यूल भी होता है।

TypeError in Admin/team reportsController#generate 
Transaction is not a module 

... 

This error occurred while loading the following files: 
    pdf/writer 
    transaction/simple 

तो, मैं यहां एक त्वरित सुधार की तलाश में हूं। एक उम्मीद है कि मेरे Transaction मॉडल का नाम बदलने और कोड के लायक कुछ हफ्तों के हफ्तों को पुन: सक्रिय करने में शामिल नहीं है।

कुछ चालाक सुझाव :) की ओर देख रहे

उत्तर

7

मेरा मानना ​​है कि इस मुद्दे को Ruport पीडीएफ की आवश्यकता होती है करने के लिए नीचे है :: लेखक मणि, जो बदले में लेनदेन :: सरल मणि की आवश्यकता है जो मॉड्यूल लेनदेन को परिभाषित करता है।

निश्चित रूप से ActiveRecord में एक # लेनदेन विधि है, लेकिन मुझे नहीं लगता कि रेल के भीतर एक लेनदेन मॉड्यूल या कक्षा है। मुझे उस पर सही होने में खुशी होगी।

नामकरण इस तरह के नामकरण विवादों से बचने के लिए आम तौर पर सबसे अच्छा अभ्यास है। जैसे

module Account 
    class Transaction < ActiveRecord::Base 
    .... 
    end 
end 

हालांकि, ActiveRecord मॉडल नामकरण अन्य मुद्दों को फेंक सकता है।

जितना समय हो सकता है उतना समय लगता है, आपके लेनदेन मॉडल का नाम बदलना सबसे अच्छा शर्त हो सकता है।

यदि आप चाहें तो भी आप अपने मौजूदा लेनदेन डेटाबेस तालिका को रख सकते हैं, इसलिए आपके मॉडल के अंदर self.table_name = "transactions" डालकर आपके माइग्रेशन को बदलने की आवश्यकता नहीं है।

अन्य मॉडलों के साथ आपके संगठनों को अभी भी आपके एसोसिएशन कॉल में class_name निर्दिष्ट करके "लेनदेन (ओं)" नाम दिया जा सकता है। जैसे

class User < ActiveRecord::Base 

    has_many :transactions, :class_name => "AccountTransaction" 

end 

उन दो सुझाव या आप कुछ समय बचाने के नहीं हो सकता है।

+0

धन्यवाद। मैंने आपके उत्तर को स्वीकृत उत्तर में बदल दिया है क्योंकि यह मेरे पास विशिष्ट समस्या का अधिक सटीक वर्णन करता है - यद्यपि यैनिस, उत्तर भी सही है! अंत में मैंने अपने मॉडल, डेटाबेस टेबल और कुछ पुराने-स्कूल ढूंढने और प्रतिस्थापित करने के सभी संगठनों का नाम बदलने का सहारा लिया;) – aaronrussell

+0

रेल के नए संस्करण में, 'set_table_name' बस' self.table_name = 'है, http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-table_name-3D –

0

आपकी समस्या तथ्य यह है कि लेन-देन भी रेल में एक आरक्षित शब्द है से आ सकती है ...

+0

यह है इसे के सामने खाली नाम स्थान रख कर इसे हल? अरे नहीं! लेकिन मुझे सूचित करने के लिए धन्यवाद ... – aaronrussell

+4

रेल सिर्फ रूबी लाइब्रेरी है, यह रुबी भाषा में कोई भी कीवर्ड नहीं जोड़ सकता है। –

+1

यह सिर्फ एक पुस्तकालय हो सकता है, लेकिन यह इसका उपयोग कर चीजों के नामकरण पर सीमा लगा सकता है (भले ही ये कारण भाषा द्वारा लागू नहीं हैं)।कॉलम नाम 'प्रकार' का उपयोग करने का प्रयास करते समय बस उस परेशानी को देखें ... –

13

पहले से ही उत्तर दिया गया है और पुराना है, लेकिन मैं यहां एक ही समस्या के साथ आया था, लेकिन इसे एक अलग तरीके से हल किया।

मेरे पास पुल और क्वेरी नामक दो मॉडल हैं। पुल में किसी विधि के भीतर Query.some_static_method() को संदर्भित करने का प्रयास करने के परिणामस्वरूप क्वेरी ActiveRecord::AttributeMethods::Query:Module पर हल हो गई।

साथ ::Query.some_static_method()

+0

अच्छा जवाब, खाली नामस्थान के बारे में नहीं पता था! –

+0

सुरुचिपूर्ण समाधान। क्या आप समझा सकते हैं कि यह वास्तव में क्यों काम करता है? – cph2117

+0

@ cph2117, जो वास्तव में करता है वह स्पष्ट है कि 'क्वेरी' ढूंढने के लिए कौन सा नेमस्पेस है। – hometoast

संबंधित मुद्दे