रेल - एसटीआई के बिना टाइप कॉलम का उपयोग करें?


82

मैं typeसिंगल टेबल इनहेरिटेंस (एसटीआई) को आमंत्रित किए बिना कॉल किए गए कॉलम का उपयोग करना चाहता हूं - मैं सिर्फ typeएक सामान्य कॉलम होना चाहता हूं जो एक है String

बिना सिंगल टेबल इनहेरिटेंस और अपवाद के फेंकने की उम्मीद करने वाली रेल के बिना मैं यह कैसे कर सकता हूं The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column 'type' is reserved for storing the class in case of inheritance.?

इसे कैसे करना है इस पर कोई आइडिया?

जवाबों:


135

रेल 3.1 set_inheritance_columnमें पदावनत किया गया है, यह भी आप nilइस तरह केवल एक नाम के रूप में उपयोग कर सकते हैं :

class Pancakes < ActiveRecord::Base
    self.inheritance_column = nil
    #...
end

वास्तव में, यह ऐसा प्रतीत होता है जैसे कि इसमें बदल गया हो rails 3.2एपीडॉक के अनुसार : 'इस पद्धति को नवीनतम स्थिर संस्करण पर पदावनत या स्थानांतरित किया गया है। अंतिम मौजूदा संस्करण (v3.1.0) यहां दिखाया गया है। ' हालांकि टिप के लिए धन्यवाद!
बाटकिंस

यह 3.1 में हटा दिया गया था और 3.2 में हटा दिया गया था, मुझे लगता है
वैलेंटाइन नेमसेव

2
@Batkins inheritance_columnपाठक को स्थानांतरित किया जाता है (इसलिए "पदावनत या स्थानांतरित" सूचना)। inheritance_columnइंस्टेंस वेरिएबल को सीधे सेट करने का उपयोग अभीष्ट नहीं है और न ही इसे हटा दिया गया है।
लुललाला

रेल में काम किया 5.1
जॉन बाचिर

22

आप एसटीआई कॉलम नाम का उपयोग करके ओवरराइड कर सकते हैं set_inheritance_column:

class Pancakes < ActiveRecord::Base
    set_inheritance_column 'something_you_will_not_use'
    #...
end

इसलिए कुछ कॉलम का नाम चुनें जिसे आप किसी भी चीज़ के लिए उपयोग नहीं करेंगे और उसे खिलाएँगे set_inheritance_column


2
क्या मुझे अपने डेटाबेस में वास्तव में कहा गया कॉलम बनाने की आवश्यकता है?
क्वास

धन्यवाद, यह काम किया। एक ढांचा होना चाहिए !!!!! कभी!!!! तय करें कि तालिका फ़ील्ड का नाम क्या हो सकता है। यह विरासत डेटा सेट के लिए बुरा है।
जॉन

5
@ जॉन: रेल वास्तव में विरासत डेटा के बारे में परवाह नहीं करता है या दूसरों के साथ अच्छा खेल रहा है, रेल के लिए बहुत अधिक रवैया है। आप इसे अपने आप में कुछ प्रयास के साथ व्यवहार कर सकते हैं, लेकिन आप हमेशा थोड़ा सा संघर्ष करते हैं यदि आपको कुछ ऐसा करने की आवश्यकता होती है, जिसके लिए रेल ने योजना नहीं बनाई है (जिसमें दुर्भाग्य से कई बुनियादी डेटाबेस अवधारणाएं शामिल हैं)। OTOH, मैं एक पेशेवर विधर्मी हूं इसलिए अन्य रेल लोग निश्चित रूप से वैचारिक समस्याओं को इंगित करने के लिए मुझसे परेशान होंगे :)
म्यू

10
मुझे लगता है कि यह विचार है कि रेल / रूबी विन्यास पर अधिवेशन पसंद करते हैं, इसलिए वे इसे उन उपयोग मामलों के लिए अनुकूलित करने का प्रयास करते हैं जो उन्हें लगता है कि वे सही हैं।
इब्राहिम

21

मुझे पता है कि यह प्रश्न पुराना है और यह उस प्रश्न से थोड़ा सा विचलित करता है, जो आप पूछ रहे हैं, लेकिन मैं हमेशा क्या करता हूं जब भी मुझे स्तंभ प्रकार या ऐसा कुछ नाम देने का आग्रह होता है, तो क्या मैं इसके प्रकार का एक पर्याय खोजता हूं और इसके बजाय इसका उपयोग करता हूं:

यहाँ कुछ विकल्प हैं: प्रकार, प्रकार, विविधता, श्रेणी, सेट, शैली, प्रजातियाँ, क्रम आदि।


10

रेल 4.x

मुझे एक Rails 4ऐप में समस्या का सामना करना पड़ा , लेकिन रेल 4 में set_inheritance_columnविधि बिल्कुल भी मौजूद नहीं है इसलिए आप इसका उपयोग नहीं कर सकते।

समाधान है कि मेरे लिए काम किया अधिभावी द्वारा एकल तालिका भाग निष्क्रिय करने के लिए था ActiveRecordकी inheritance_columnविधि, इस तरह:

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

आशा है कि इससे सहायता मिलेगी!


8
सरल संस्करण class MyModel < ActiveRecord::Base self.inheritance_column = nil end:। संदर्भ: apidock.com/rails/ActiveRecord/ModelSchema/ClassMethods/...
Benj

1
मेरे लिए रेल में काम करता है 4.2.2। शायद आपने परिवर्तन करने के बाद सर्वर या स्प्रिंग को पुनरारंभ नहीं किया?
बेंज

1
और अन्य उपयोगकर्ता मेरे द्वारा टिप्पणी किए गए सरल संस्करण को उपयोगी पा सकते हैं। पुनः लोड मुद्दे के लिए, मैं विशेषज्ञ नहीं हूँ, लेकिन यह मेरे लिए एक वर्ग की संपत्ति है जो स्वचालित रूप से अनलोड किए बिना पुनः लोड नहीं किया जाएगा और वर्ग परिभाषा को फिर से लोड करने के लिए समझ में आता है।
बेंज जू।

2
मुझे आपकी प्रतिक्रिया समझ में नहीं आ रही है, मैं सिर्फ आपके उत्तर के लिए एक उपयोगी जोड़ देने की कोशिश कर रहा हूं। आप क्यों आहत महसूस कर रहे हैं? मुझे शांति
मिलती है

2
@Benj लगता है कि उन्होंने जो भी टिप्पणी (ओं) को हटा दिया है, अब आप ऐसा कर रहे हैं, ऐसा लगता है जैसे आप खुद से बहस कर रहे हैं। ;)
जोशुआ पिंटर

0

यदि आप सभी मॉडलों के लिए ऐसा करना चाहते हैं, तो आप इसे इनिशियलाइज़र में चिपका सकते हैं।

ActiveSupport.on_load(:active_record) do
  class ::ActiveRecord::Base
    # disable STI to allow columns named "type"
    self.inheritance_column = :_type_disabled
  end
end

या बेहतर अभी तक - ApplicationRecord में
अलेक्जेंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.