2013-07-06 11 views
5

यदि मॉडल का एसोसिएशन "has_one" या "" रिश्ते है (यानी यह एक ऑब्जेक्ट या कई लोगों के लिए एक सहयोग है) तो गतिशील रूप से निर्धारित करने का एक आसान तरीका है।रेल निर्धारित करते हैं कि क्या एसोसिएशन है_ऑन या है_मनी

मैं MongoMapper उपयोग कर रहा हूँ, इसलिए मैं अगर एक वर्ग klass एक एक या के माध्यम से

klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::OneAssociation 
klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::ManyAssociation 

कई रिश्ते के साथ एक संबद्ध मॉडल assoc है, लेकिन यह नहीं बल्कि भद्दा लगता है, और साधारण नहीं है की जाँच करने में सक्षम हूँ (यानी ActiveRecord एसोसिएशन के लिए भी काम नहीं करेगा)। मैं किसी ऑब्जेक्ट को लोड करने से बचना चाहूंगा, इसलिए मुझे पूरा यकीन है कि instance.assoc.is_a? Array भी बाहर है।

कोई विचार?

+0

कभी इसे बाहर निकालें? मुझे बस एक ही चीज़ मिल गई, लेकिन सिर्फ 'ActiveRecord' – MCB

उत्तर

6

अद्यतन: तो, मैं कुछ विचार कक्षा तरीकों http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html

पर हुआ आप reflect_on_all_associations विधि के साथ सभी has_many, belongs_to, आदि प्राप्त कर सकते हैं। यह सब वहाँ है। या फिर आप reflect_on_association में एक संघ में डाल सकते हैं और यह आपको पता चलेगा कि यह एक has_many, has_one, आदि विशेष रूप से है:

Model.reflect_on_association(:assoc).macro 

यह सभी मामलों के लिए पर्याप्त होना चाहिए। यह वास्तव में उस समस्या को हल नहीं करता है जिसे मैं वर्तमान में काम कर रहा हूं, लेकिन इसे हल करना चाहिए।

+0

के लिए यह सही नहीं है, लेकिन यह आपके वर्ग के नामों के आधार पर काम कर सकती है। एक वर्ग 'उपयोगकर्ता' पर विचार करें जो 'UserAttributes' नामक किसी अन्य वर्ग का' है_ऑन' है। दुर्भाग्यवश आप इसे 'user.user_attributes' के माध्यम से एक्सेस करेंगे जो 'respond_to? (Assoc_name.singularize)' कॉल पर झूठी रिटर्न देता है। आप तर्क दे सकते हैं (और आप शायद सही होंगे) कि आपको इस वर्ग 'उपयोगकर्ता एट्रिब्यूटसेट' या कुछ इसी तरह का नाम बदलना चाहिए, इस मामले में 'एकवचन' काम करेगा, लेकिन इस बात की कोई गारंटी नहीं है कि आपको एसोसिएशन प्रकार सही होगा या नहीं उदाहरण का नाम एकवचन या बहुवचन है। – pariser

+0

ठीक है, एक बहुवचन मॉडल नाम होने से रेल नामकरण सम्मेलन (http://itsignals.cascadia.com.au/?p=7) के खिलाफ जाना होगा, इसलिए आपके पास कभी भी एक मॉडल UserAttributes नहीं होना चाहिए। यह हमेशा UserAttribute होना चाहिए। तो एकवचन या बहुवचन को has_one या has_many रिश्ते को प्रतिबिंबित करना चाहिए। इनपुट के साथ शुरू होने वाले किसी भी तर्क में किसी भी अन्य चिंताओं को संभाला जाना चाहिए। – MCB

+0

वास्तव में आप सही हैं - यह दिखाने का बेहतर तरीका है कि इसमें हर मामले को शामिल नहीं किया गया है: मॉडल 'मछली' पर विचार करें जहां एसोसिएशन का नाम 'मछली" असंभव है। इसका मतलब है कि "मछली" शब्द संज्ञा का एकवचन और बहुवचन रूप है (यानी "मछली" .singularize == "मछली" .pluralize'), इसलिए इसका मतलब है कि आप नहीं जानते कि मॉडल 'has_one है : मछली 'या 'है_मनी: मछली'। – pariser

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