2011-03-15 12 views
9

मैं एक विधि लागू कर रहा हूं, जिसका उपयोग किसी परियोजना के कई स्थानों पर किया जाएगा।प्रतीक से मॉडल वर्ग प्राप्त करें

def do association 

end 

"संघ" जब संघ :articles है, मैं अनुच्छेद मॉडल के साथ काम करने की जरूरत :articles, :tags, :users आदि

की तरह, एक प्रतीक है।

जब एसोसिएशन :users है, तो मुझे उपयोगकर्ता मॉडल के साथ काम करने की आवश्यकता है।

आदि

मुझे पता है, कि मैं एक सहायक विधि, उस मॉडल वर्ग देता है, प्रदान की प्रतीक के आधार पर लिख सकते हैं। लेकिन क्या इसके लिए विधि का उपयोग करने के लिए तैयार है?

उत्तर

26

रेल एक विधि ऐसे प्रयोजन के लिए String वर्ग पर classify कहा जाता है प्रदान करता है के साथ।

:users.to_s.classify.constantize 
#User 

:line_items.to_s.classify.constantize 
#LineItem 

संपादित करें:

Author.reflect_on_association(:books).klass 
# => Book 

इस परिदृश्य जहां संघ नाम नहीं करता है 'संबोधित करेंगे:

आप एक संघ के साथ जुड़े वर्ग प्राप्त करने का प्रयास कर रहे हैं, इस दृष्टिकोण का उपयोग कक्षा के नाम से मेल नहीं खाता।

उदा:

class Order 
    has_many :line_items 
    has_many :active_line_items, :class_name => "LineItem", 
      :conditions => {:deleted => false} 
end 

उपरोक्त उदाहरण में, :active_line_itemsActiveLineItem में परिणाम होगा और हमारे मूल कोड त्रुटि फेंक देते हैं।

इस here के बारे में और पढ़ें।

+0

आपको '# safe_constantize' संस्करण' पर भी एक नज़र डालना चाहिए, जो मूल रूप से '# constanzize' जैसा ही होता है, लेकिन अगर वर्ग नहीं मिला तो नामरर नहीं उठाया जाता है। इसके बजाय यह 'शून्य 'लौटाता है। यह अपवाद के मुकाबले थोड़ी अधिक आसान हो जाता है। उदाहरण के लिए: 'model_name.to_s.classify.safe_constantize || Event' –

1

यह काम करेंगे

(:users.to_s.singularize.capitalize.constantize).find :all, :conditions => ["name = ?", "john"] 

और अपने उदाहरण

association.to_s.singularize.capitalize.constantize 
+0

कूल :) धन्यवाद! – AntonAL

+0

यह समाधान काम नहीं करेगा जब कक्षा के नाम के दो भाग होते हैं, उदाहरण: 'order_details' के परिणामस्वरूप 'ऑर्डरडेंट'' के बजाय' Order_detail' होगा। –

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