2010-07-13 5 views
12

संक्षिप्त: मेरे पास एक विदेशी कुंजी विशेषता है और यह जानना है कि उस विदेशी कुंजी फ़ील्ड की कक्षा (या संदर्भ तालिका) क्या है।केवल विदेशी कुंजी विशेषता के आधार पर एक एसोसिएशन की कक्षा क्या है?

प्रसंग:

दिया 2 टेबल: users(id, [other fields]) और issues(id, user_id, assigned_to, [other fields])

यहाँ जारी करने की मेरी सक्रिय रिकॉर्ड (अप्रासंगिक भागों निकाले जाते हैं)

class User < ActiveRecord::Base 
    ... 
end 
class Issue < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :assigned_user, :foreign_key => 'assigned_to', :class_name => 'User' 
    ... 
end 

मैं एक उपयोगकर्ता पठनीय परिवर्तन लॉगिंग बनाना चाहते है । जैसे असाइन किए गए उपयोगकर्ता को बदलते समय मैं इस तरह का संदेश प्राप्त करना चाहता हूं: Assigned to is changed from Otto to Zoltan। ActiveRecord में changes फ़ंक्शन है जो एक अच्छा प्रारंभिक बिंदु है लेकिन यह मुझे केवल संदर्भ आईडी-एस देता है। नामों में अनुवाद करने के लिए मुझे आईडी द्वारा उपयोगकर्ता को पढ़ने की जरूरत है।

एसोसिएशन :user के लिए यह काफी आसान है क्योंकि मुझे केवल सम्मेलनों का पालन करना है। लेकिन assigned_to विशेषता के लिए एक ही जानकारी कैसे प्राप्त करें (मैं एक सामान्य समाधान बनाना चाहता हूं)? क्या यह पता लगाना संभव है कि क्या हमारे पास दिए गए गुण के लिए सहयोग है या नहीं? क्या हम उस संगठन की कक्षा निकाल सकते हैं?

उत्तर

3

धन्यवाद। विशिष्ट समस्या (सीखने के लिए) के लिए अंतिम समाधान यहां दिया गया है:

def textalize_changes 
    if changed? 
     r = "" 
     changes.keys.each do |k| 
     r << "#{k.humanize} changed " 
     r << "from `#{translate(k,changes[k][0])}` " 
     r << "to `#{translate(k,changes[k][1])}`" 
     r << "<br/>" 
     end 
     r 
    end 
    end 

    def translate(attr_name, attr_value) 
    ass = self.class.reflect_on_all_associations(:belongs_to).reject{|a| attr_name != a.primary_key_name} 
    if 1 == ass.length and !attr_value.blank? 
     obj = ass[0].klass.find(attr_value) 
     obj.send(:name) 
    else 
     attr_value 
    end 
    end 
29

सबसे पहले, आप जो एसोसिएशन चाहते हैं उसके लिए मेटाडेटा प्राप्त करने के लिए आप reflect_on_association का उपयोग कर सकते हैं।

reflection = Issue.reflect_on_association(:assigned_user) 
reflection.class # => ActiveRecord::Reflection::AssociationReflection 
reflection.class_name # => 'User' 

डॉक्स here और there का संदर्भ लें: तो फिर, उसके परिणाम (जो एक MacroReflection वंशज है) से आप बाहर वर्ग पा सकते हैं।

+0

आपके दस्तावेज़ लिंक काम नहीं कर रहे हैं। साथ ही, क्या पूर्ण नामस्थान प्राप्त करने का कोई तरीका है? 'MyModule :: उपयोगकर्ता' –

+2

आह की तरह, आप नामस्थान प्राप्त करने के लिए प्रतिबिंब.क्लास को कर सकते हैं। –

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