2011-09-08 16 views
6

मैं गतिशील रूप से अनुरोध के दौरान ActiveRecord मॉडल वर्ग का तालिका नाम बदलना चाहता हूं।रेल 3/ActiveRecord: गतिशील रूप से अनुरोध के दौरान तालिका नाम को कैसे बदलें/बदलें?

mydb: 
    sample_data_12222 
    sample_data_12223 
    sample_data_12224 
    sample_data_12225 
    ... 

तो, मुझे क्या करना चाहते है ...

_1:


उदाहरण के लिए, इसी तरह के कई संरचना (कॉलम) होने टेबल नहीं है। आधार मॉडल वर्ग को परिभाषित करना:

class SampleData < ActiveRecord::Base 

_2। की तरह अनुरोध के दौरान लक्ष्य तालिका में बदलना:

def action_method 
    SampleData.set_table_name "sample_data_#{params[:id]}" 
    @rows = SampleData.all 

ऐसा लगता है कि कोड के ऊपर सही है अगर यह गैर पिरोया पर्यावरण पर चलाए जाने के दौरान (जैसे पैसेंजर/mod_rails पर)। लेकिन यह धागा-सुरक्षित नहीं है, इसलिए यह थ्रेडेड-पर्यावरण (जैसे जेआरबी-रैक पर) पर काम नहीं कर सकता है।

इसके अलावा मैं इस तरह delived वर्ग बनाने की कोशिश की:

def action_method 
    @model_class = Class.new(SampleData) 
    @model_class.set_table_name "sample_data_#{params[:id]}" 
    @rows = @model_class.all 

लेकिन यह मेमोरी लीक कारण है, हालांकि delived मॉडल वर्ग किसी भी अधिक इस्तेमाल नहीं किया है अनुरोध पूर्ण होने के बाद। :(


वहाँ ऐसा करने के लिए एक बेहतर तरीका है

+0

आपके विचार के लिए धन्यवाद, मैं कुछ इसी तरह की तलाश कर रहा था (लेकिन थोड़ा और सरल)। उम्मीद है कि मेरा जवाब (अभी भी) आपकी मदद करेगा @ – Veger

+0

धन्यवाद, और आपके उत्तर को स्वीकार करने के लिए खेद है। ;) मैं आपके उत्तर के समान कुछ भी पहुंचा। – kaorukobo

उत्तर

6

मैं कक्षा चर का प्रयोग करेंगे? मेमोरी लीक पैदा करने के बिना

class SampleData < ActiveRecord::Base 
    class << self 
    @@model_class = {} 

    # Create derived class for id 
    @@model_class[id] = Class.new(SampleData) 
    @@model_class[id].set_table_name "sample_data_#{id}" 
    # Repeat for other IDs 
    end 
end 

अब आप व्युत्पन्न वर्ग अधिक से अधिक उपयोग कर सकते हैं

आपकी वास्तविक स्थिति (उदाहरण के लिए आप पहले से ही आईडी नहीं जानते हैं) के आधार पर, आप जांच सकते हैं कि आईडी पहले से ही हैश में गतिशील है और यदि नहीं है तो इसे जोड़ें।

+0

आप अपने मूल वर्ग के साथ-साथ @@ model_class [id] कक्षा का उपयोग कैसे करेंगे? –

+0

@veger यह अच्छा समाधान है लेकिन संघों के लिए काम नहीं करता है। उपयोगकर्ता = SampleData.model_class [44] .find (2)/* क्वेरी टेबल - sample_data_44 */ उपयोगकर्ता। एड्रेस/* क्वेरी टेबल - पते, पते नहीं_44 */ – kapso

+0

यदि मुझे 10 टेबल चाहिए तो क्या मुझे लूप बनाना चाहिए? '# अन्य आईडी के लिए दोहराएं ' – Frexuz

संबंधित मुद्दे