2010-10-28 10 views
9

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

>> Member::Ssg.find(:first) 
=> #<Member::Ssg ssg_key: #<BigDecimal:10b169688,'0.253E3',4(8)>, org_id: 2, academic_year: 2006, class: true, next_due_date: "2011-06-01", submitted_date: "2006-02-13", notes: nil, owner_id: "1"> 
>> Member::Ssg.find(:first).notes 
NoMethodError: undefined method `generated_methods' for true:TrueClass 
     from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:247:in `method_missing' 
     from (irb):2 
>> Member::Ssg.find(:first).notes 
=> nil 

समाधान: मैं अपने मॉडल के लिए Bellmyer समाधान और नीचे दिए गए कोड को जोड़ने के संयोजन के साथ चला गया

class << self 
    def instance_method_already_implemented?(method_name) 
    return true if method_name == 'class' 
    super 
    end 
end 
+0

बस कहने के लिए कि आपकी अपडेट समाधान महान काम किया चाहते हैं: यहाँ लिंक है। धन्यवाद! –

+0

@ जस्टिनहोल्डस्क्लो, क्या आपने इसे रेल 4 या 5 पर आजमाया था? –

+0

@ महमूदएम। अब्देल-फट्टाह यह रेल 4.2 पर था –

उत्तर

9

नोट: कृपया इस जवाब के अंत में अपडेट समाधान देखते हैं। ऐतिहासिक कारणों के लिए मूल पुराने समाधान छोड़ना।

यह अक्सर पर्याप्त होता है (विरासत कॉलम नाम रूबी/रेल के साथ हस्तक्षेप करते हैं) कि मैं बस इससे प्लगइन कर सकता हूं। यहां बताया गया है कि आप इसे तुरंत कैसे ठीक कर सकते हैं। अब

# lib/bellmyer/create_alias.rb 
module Bellmyer 
    module CreateAlias 
    def self.included(base) 
     base.extend CreateAliasMethods 
    end 

    module CreateAliasMethods 
     def create_alias old_name, new_name 
     define_method new_name.to_s do 
      self.read_attribute old_name.to_s 
     end 

     define_method new_name.to_s + "=" do |value| 
      self.write_attribute old_name.to_s, value 
     end 
     end 
    end 
    end 
end 

और, अपने मॉडल में: अपने ऐप्लिकेशन में इस फ़ाइल बनाएँ

class Member < ActiveRecord::Base 
    include Bellmyer::CreateAlias 
    create_alias 'class', 'class_name' 
end 

create_alias को पहले पैरामीटर पुराना तरीका नाम है, और दूसरा पैरामीटर नया नाम आप करना चाहते हैं इसे कॉल करें, जो रेलों में हस्तक्षेप नहीं करेगा। यह मूल रूप से read_attribute और write_attribute विधियों को ActiveRecord द्वारा परिभाषित रूबी विधियों के बजाय कॉलम के साथ संवाद करने के तरीकों का उपयोग करता है। बस इतना की तरह हर जगह क्षेत्र के लिए नया नाम उपयोग करने के लिए, सुनिश्चित करें:

member.class_name = 'helper' 

यह गहरे लाल रंग का 1.8 के साथ काम करता है, लेकिन मैं अभी तक गहरे लाल रंग का 1.9 के साथ परीक्षण नहीं किया। आशा है कि ये आपकी मदद करेगा!

अद्यतन: मुझे एक बेहतर समाधान मिला है जो रेल 3, saf_attributes मणि में काम करता है। मैंने एक ब्लॉग पोस्ट लिखा है कि इसका उपयोग कैसे किया जाए, उदाहरण के लिए कोड स्निपेट, और एक पूर्ण नमूना ऐप जिसे आप जिथब से डाउनलोड कर सकते हैं और साथ खेल सकते हैं।

Legacy Database Column Names in Rails 3

+1

यह चाल नहीं करता है। यह मुझे कक्षा कॉलम के मान को संदर्भित करने की अनुमति देता है, लेकिन मुझे अभी भी त्रुटि नहीं है NoMethodError: सत्य के लिए अपरिभाषित विधि 'gener_methods': TrueClass /Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/ से active_record/attribute_methods.rb: 247: 'method_missing' से (irb): 2 – Anna

+0

मैंने अपने उत्तर को एक समाधान समाधान के साथ अपडेट किया है। –