मैं प्राथमिक कुंजी के रूप में अपने सक्रिय रिकॉर्ड्स में स्वत: वृद्धि वाले पूर्णांक के बजाय ऑटो-जेनरेटेड हैश का उपयोग करना चाहता हूं। इससे दो सवाल उठते हैं:
- इस पीढ़ी को सबसे कुशल तरीके से कैसे निष्पादित किया जाए?
- कैसे संभावना है कि उत्पन्न हैश तालिका में पहले से मौजूद है को संभालने के लिए?
सादर, माटुस्ज़ो
4 जवाब
यह आपके प्रश्न का डुप्लिकेट नहीं है, लेकिन मुझे लगता है कि आप वही काम करना चाहते हैं:
रूबी ऑन रेल्स में प्रत्येक उपयोगकर्ता को एक अद्वितीय 100 वर्ण हैश असाइन करना
अगर आप ऐसा इसलिए चाहते हैं क्योंकि आप वेब यूआरएल में आईडी नहीं दिखाना चाहते हैं। आप https://github.com/peterhellberg/hashids.rb जैसे रत्न का उपयोग कर सकते हैं
यह आपके डेटाबेस आईडी से एक प्रतिवर्ती हैश बनाता है ताकि हैश को डेटाबेस में संग्रहीत करने की आवश्यकता न हो।
इसे अपने मॉडल to_param
विधि में प्रयोग करें।
class MyModel < ActiveRecord::Base
def to_param
Hashids.new("salt").encode(id)
end
end
और डेटाबेस से रिकॉर्ड खोजने से पहले हैश को डीकोड करें।
def show
id = Hashids.new("salt").decode(params[:id]).try(:first)
record = MyModel.find(id)
end
हो सकता है कि यह ठीक वैसा न हो जैसा आपने मांगा था। लेकिन मुझे एक ऐसी ही समस्या थी जहां मैं यूआरएल में आईडी के बजाय हैश का उपयोग करना चाहता था। मेरा समाधान इस प्रकार है
- मैंने अपनी तालिका में एक कॉलम जोड़ा है जिसे प्राइवेटलिंक कहा जाता है
- मेरे मॉडल में मैंने लिखा है:
#changes the url to use privatelink instead of the id
def to_param
privatelink
end
#calls the private method set_privatelink
before_create :set_privatelink
private
#generates a unique hash looking something like this: c24bea1693d9e56a1878cb83f252fba05532d9d0
def set_privatelink
self.privatelink = Digest::SHA1.hexdigest([Time.now, rand].join)
end
स्रोत: URL में रेलकास्ट #63 मॉडल का नाम - to_param पद्धति का उपयोग करने का तरीका दिखाता है
ओरेकल का उपयोग करते समय मेरे पास ऐसा मामला था जहां मैं स्वयं आईडी बनाना चाहता था (और अनुक्रम का उपयोग नहीं करता), और यह पोस्ट मैं विवरण प्रदान करता हूं कि मैंने यह कैसे किया। संक्षेप में कोड:
# a small patch as proposed by the author of OracleEnhancedAdapter: http://blog.rayapps.com/2008/05/13/activerecord-oracle-enhanced-adapter/#comment-240
# if a ActiveRecord model has a sequence with name "autogenerated", the id will not be filled in from any sequence
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
alias_method :orig_next_sequence_value, :next_sequence_value
def next_sequence_value(sequence_name)
if sequence_name == 'autogenerated'
# we assume id must have gotten a good value before insert!
id
else
orig_next_sequence_value(sequence_name)
end
end
end
जबकि यह समाधान ओरेकल-एन्हांस्ड के लिए विशिष्ट है, मैं अन्य एडेप्टर के अंदर मान रहा हूं कि आप उसी विधि (next_sequence_value
) को खत्म कर सकते हैं।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
ruby-on-rails
रूबी ऑन रेल्स रूबी में लिखा गया एक ओपन सोर्स फुल-स्टैक वेब एप्लिकेशन फ्रेमवर्क है। यह लोकप्रिय एमवीसी फ्रेमवर्क मॉडल का अनुसरण करता है और इसे "कॉन्फिगरेशन ओवर कॉन्फिगरेशन" अप्रोच डेवलपमेंट के दृष्टिकोण के लिए जाना जाता है।