मैं प्राथमिक कुंजी के रूप में अपने सक्रिय रिकॉर्ड्स में स्वत: वृद्धि वाले पूर्णांक के बजाय ऑटो-जेनरेटेड हैश का उपयोग करना चाहता हूं। इससे दो सवाल उठते हैं:

  1. इस पीढ़ी को सबसे कुशल तरीके से कैसे निष्पादित किया जाए?
  2. कैसे संभावना है कि उत्पन्न हैश तालिका में पहले से मौजूद है को संभालने के लिए?

सादर, माटुस्ज़ो

8
Mateusz 31 मार्च 2011, 12:14

4 जवाब

सबसे बढ़िया उत्तर

यह आपके प्रश्न का डुप्लिकेट नहीं है, लेकिन मुझे लगता है कि आप वही काम करना चाहते हैं:

रूबी ऑन रेल्स में प्रत्येक उपयोगकर्ता को एक अद्वितीय 100 वर्ण हैश असाइन करना

2
Community 23 मई 2017, 15:00

अगर आप ऐसा इसलिए चाहते हैं क्योंकि आप वेब यूआरएल में आईडी नहीं दिखाना चाहते हैं। आप 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
8
Mika 7 अक्टूबर 2014, 08:47

हो सकता है कि यह ठीक वैसा न हो जैसा आपने मांगा था। लेकिन मुझे एक ऐसी ही समस्या थी जहां मैं यूआरएल में आईडी के बजाय हैश का उपयोग करना चाहता था। मेरा समाधान इस प्रकार है

  1. मैंने अपनी तालिका में एक कॉलम जोड़ा है जिसे प्राइवेटलिंक कहा जाता है
  2. मेरे मॉडल में मैंने लिखा है:
  #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 पद्धति का उपयोग करने का तरीका दिखाता है

4
Hilde 25 सितंबर 2012, 14:18

ओरेकल का उपयोग करते समय मेरे पास ऐसा मामला था जहां मैं स्वयं आईडी बनाना चाहता था (और अनुक्रम का उपयोग नहीं करता), और यह पोस्ट मैं विवरण प्रदान करता हूं कि मैंने यह कैसे किया। संक्षेप में कोड:

# 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) को खत्म कर सकते हैं।

0
nathanvda 31 मार्च 2011, 14:26