2011-10-10 18 views
12

मुझे अपने फ्रीराडीस सर्वर द्वारा उपयोग किए गए मौजूदा डेटाबेस से कनेक्ट करना होगा। एक तालिका में एक कॉलम होता है जिसे विशेषता कहा जाता है जिसे मैं एक्सेस करने का प्रयास कर रहा हूं।ActiveRecord :: DangerousAttributeError

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord 

मैं का चयन करें और अपने मॉडल में इस स्तंभ का नाम बदलने की कोशिश की है:

जब तक पहुँचने, मैं उसके त्रुटि मिलती है

def self.default_scope 
    Radcheck.select("attribute as newattribute") 
end 

लेकिन है कि या तो काम नहीं कर रहा।

क्या कोई इस के आसपास एक तरीका सुझा सकता है? मैं रेलवे में कॉलम का नाम बदलना चाहूंगा!

उत्तर

2

मैं ऐसी स्थिति में कभी नहीं समाप्त हो गया है लेकिन मुझे लगता है कि यह काम करना चाहिए

class Radcheck < ActiveRecord::Base 
    default_scope :select=> 'attribute as newattribute' 
end 

आप उदाहरण विधि default_scope नहीं वर्ग का उपयोग करना चाहिए एक

इसके अलावा, आप, उदाहरण के विधि का उपयोग करने की तरह एक विकल्प है:

RadCheck.read_attribute :attribute 

आशा है कि यह

+0

धन्यवाद दृश्य का उपयोग - मैं इस की कोशिश की है और मैं अभी भी विस्फोट त्रुटि मिलती है: मेरे मामले में यह केवल पढ़ने के लिए है उपयोग ।क्या मुझे अपने नियंत्रक कार्रवाई को भी बदलने की ज़रूरत है? वर्तमान में मेरे पास यह है: @radcheck = Radcheck.all धन्यवाद –

+0

AR4 –

10

में मदद करता है एक सी पर देखभाल करने के लिए के बारे में जो विशेषताओं रेल 3.0 में ActiveRecord के पास सुरक्षित हैं सिर्फ अपने Gemfile को

gem 'safe_attributes' 

जोड़ सकते हैं और मणि सब टकराने के नाम की देखभाल करने की कोशिश करेंगे होने के बिना https://stackoverflow.com/a/9106597/1266906

: Milar सवाल मैं इस सवाल का जवाब मिल गया खुद ब खुद।

अन्य जवाब के साथ के रूप में आप आंतरिक रूप से सुरक्षित नाम के साथ क्षेत्रों तक पहुँचने के लिए Radcheck[:attribute] या Radcheck.read_attribute :attribute/Radcheck.write_attribute :attribute, 'value' उपयोग करने की आवश्यकता है, लेकिन मणि सुनिश्चित करता है validates_presence_of :attribute तरह सत्यापन के रूप में हमेशा की तरह काम करेंगे।

अधिक जानकारी https://github.com/bjones/safe_attributes

+1

में काम नहीं किया था, मैं अपने विरासत डेटाबेस में मान्य एक विशेषता के साथ एक ही समस्या में आया था। "Safe_attributes" का उपयोग करके बॉक्स से बाहर काम किया। – dhenze

+2

Googlers के लिए बस एक नोट: यह मणि 'विशेषता' के लिए * को छोड़कर * किसी भी आरक्षित शब्द * के लिए काम करेगा। रीडमे से: "ActiveRecord का उपयोग करते समय आपकी स्कीमा में 'विशेषता' नामक कॉलम रखना लगभग असंभव है।" –

+0

यदि हिरब का उपयोग भी करते हैं, तो आपको Winb.disable के साथ कंसोल में मॉडल कॉलम प्रस्तुत करने से पहले अक्षम करने की आवश्यकता हो सकती है। –

0

यहाँ एक समाधान बाहरी डेटाबेस के लिए एक परिवर्तन की आवश्यकता होती है वह यह है कि में उपलब्ध हैं, लेकिन यह एक बहुत ही मामूली परिवर्तन है, और यह किसी भी कॉलम नाम भी `attribute` साथ काम करेंगे। कोई मणि आवश्यक नहीं है।

आपके बाहरी/विरासत डेटाबेस में एक दृश्य बनाएं जो समस्याग्रस्त कॉलम का नाम बदलता है। जैसे

CREATE VIEW radcheck_view AS (
    SELECT id, username, op, value, attribute rad_attribute 
    FROM radcheck 
); 

यहाँ समस्या स्तंभ rad_attribute को attribute नाम दिया जा रहा है।

दृश्य पर उचित अनुमतियां देना न भूलें।

GRANT SHOW VIEW ON radius.radcheck_view TO <rails_user> IDENTIFIED BY '<password>'; 

फिर, अपने रेल मॉडल के रूप में table_name

class RadiusRadcheck < RadiusExternal 
    self.table_name = 'radcheck_view' 
end