2010-11-08 8 views
6

मुझे उपयोगकर्ताओं को अन्य उपयोगकर्ताओं के प्रशंसकों बनने में सक्षम होने की आवश्यकता है। मुझे इसे कैसे डिजाइन/सेट करना चाहिए?कैसे करें: उपयोगकर्ता के प्रशंसकों

मुझे उपयोगकर्ता प्रशंसकों के विवरण देखने में सक्षम होना चाहिए।

उदाहरण के लिए। मेरे पास उपयोगकर्ता है: फू। फू के 3 प्रशंसकों हैं। मैं फू के प्रशंसकों के नाम ढूंढने में सक्षम होना चाहता हूं। जैसे:

foo = User.first 
foo.name (returns 'Foo') 
foo.fans.first.user.name (should return 'bar', since 'bar' is a fan of 'foo') 

यह मैं इसे कैसे पल में स्थापित किया है है:

User model: 
    embeds_many :fans 
    references_many :fans 

Fan model: 
    embedded_in :user, :inverse_of => :fans 
    referenced_in :user 

In console, I do: 
    User.first.fans.create!(:user => User.first) 

और मैं: Mongoid :: त्रुटियाँ :: InvalidCollection: संग्रह के लिए प्रवेश फैन है के लिए चूंकि यह एक एम्बेडेड दस्तावेज़ नहीं है, इसलिए रूट दस्तावेज़ से संग्रह तक पहुंचें। मुझे लगता है कि समस्या यह है, क्योंकि प्रशंसक मॉडल उपयोगकर्ता मॉडल में एम्बेडेड है जिसमें उपयोगकर्ता मॉडल के लिए भी एक संदर्भ है ....

आपके विचारों की बहुत सराहना की जाएगी।

उत्तर

9

एक आत्म निर्देशात्मक संघ के बारे में कैसे:

class User 
    include Mongoid::Document 
    references_many :fans, 
        :class_name => 'User', 
        :stored_as => :array, 
        :inverse_of => :fan_of 

    references_many :fan_of, 
        :class_name => 'User', 
        :stored_as => :array, 
        :inverse_of => :fans 
end 

# let's say we have users: al, ed, sports_star, movie_star  
sports_star.fans << al 
movie_star.fans << al 
sports_star.fans << ed 
movie_star.fans << ed 

movie_star.fans # => al, ed 
al.fan_of  # => sports_star, movie_star 

समस्या यह है कि आप रिलेशनल संघ केवल एम्बेडेड दस्तावेज़ों का उपयोग करने के लिए कोशिश कर रहे हैं। जब आपके पास User के अंदर एम्बेडेड Fan है, तो आप अपने माता-पिता User के माध्यम से केवल Fan तक पहुंच सकते हैं। आप Fan.find(some_id) जैसे कुछ नहीं कर सकते क्योंकि Fan रिकॉर्ड्स का कोई संग्रह नहीं है।

आखिरकार, मोंगोडीबी वर्चुअल संग्रह का समर्थन करेगा जो आपको ऐसा करने की अनुमति देगा। अभी के लिए, आपको संबंधपरक प्रकार के संगठनों का उपयोग करना होगा। यदि आप इस मामले में एम्बेडेड दस्तावेज़ों का उपयोग करना चाहते हैं, तो आपको अभिभावक अभिलेखों के माध्यम से खोजने के लिए कुछ बदसूरत और अक्षम कस्टम विधियां बनाना होगा।

मोंगोडीबी और मोंगोइड के साथ, मैंने पाया है कि आप आसानी से एम्बेडेड और रिलेशनल एसोसिएशन के बीच स्विच कर सकते हैं। एसक्यूएल-प्रकार के रिश्ते और एम्बेडेड रिश्ते दोनों में उनकी जगह होती है और इसका प्रभाव बहुत प्रभावशाली ढंग से किया जा सकता है।

+0

उपयोगकर्ता.फर्स्ट.फैन << User.last देता है मोंगो :: ऑपरेशन विफलता: अमान्य क्वेरी –

+1

आप इस तरह 'पहले' और 'आखिरी' का उपयोग नहीं कर सकते हैं, और आप इस तरह के स्थान पर एसोसिएशन को संशोधित नहीं कर सकते हैं। अक्सर, 'User.last' वही चीज़' user.first' के रूप में वापस कर देगा! आपको 'u = user.all.entries.first करना होगा; u2 = User.all.entries.last; u.fans << u2'। मैंने अभी इस कोड का फिर से परीक्षण किया है और यह मेरे लिए काम करता है। – bowsersenior

+0

और यह मुझे उपयोगकर्ताओं को स्वयं का प्रशंसक बनने की अनुमति देगा? –

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