2009-07-30 11 views
6

हर कोई।रेल की Activerecord तालिका स्वयं को कैसे संदर्भित कर सकती है?

SystemInfo < ActiveRecord::Base 
    belongs_to :SystemInfo 

end 

विचार, है प्रणाली एक अपने बच्चे के रूप में प्रणाली बी हो सकते हैं: मैं एक विचार ActiveRecord उपयोग करने के लिए कुछ नीचे दिए गए उदाहरण की तरह अजीब लागू करने के लिए की है। इसलिए मैं आवेदन के कंकाल उत्पन्न होगा के रूप में:

script/generate scaffold SystemInfo parent_id:integer name:string 

और फिर, जब मैं डालने सिस्टम एक, मैं प्रणाली बी के PARENT_ID के रूप में सिस्टम एक की आईडी का उपयोग करेगा (सिस्टम एक के PARENT_ID 'शून्य' के लिए बराबर होगा और जब मैं का उपयोग करें। इस तरह आदेश:

sysA = SystemInfo.find_by_id(1) # Get System A 

मुझे लगता है कि यह प्रणाली एक पाने के लिए संभव है, और यह बच्चा है, सिस्टम बी इसी रहे हैं:

sysA.childrens # Get System B and other SystemInfo which has parent_id == 1 (System A's ID) 

आप दिशानिर्देश सुझाव है कि सकता है मुझे इस विचार को लागू करने के लिए मैं? थी एनके यह काफी आम विचार है और हमें इसे करना संभव है। ;)

उत्तर

15

आपके पास सही विचार है।

class SystemInfo < ActiveRecord::Base 
    belongs_to :parent, :class_name => 'SystemInfo' 
    has_many :children, :class_name => 'SystemInfo', :foreign_key => 'parent_id' 
end 

s = SystemInfo.find(1) 
s.children 
# => [...] 
s.parent 
# => <SystemInfo> 
+0

धन्यवाद, एरिक। मैंने आपके समाधान की कोशिश की है, लेकिन जब मैं इसे कंसोल में रीस्टेट करता हूं तो यह नीचे जैसा कुछ दिखाता है: पुनः लोड करें! को पुन: लोड ... => true >> SysInfo.find (: सभी) SysInfo.find (: सभी) ArgumentError: अज्ञात कुंजी (ओं): वर्ग मैं रेल 2.3.3 का उपयोग करें। क्या आप मुझे समझा सकते हैं कि मैं आपके जैसा क्यों नहीं कर सकता? – Teerasej

+0

मुझे पता चला कि मुझे क्या सुधारना है। मुझे 'वर्ग' के बजाय 'वर्ग_नाम' का उपयोग करने की आवश्यकता है (हो सकता है, यह नए रेल संस्करण से हो)। बहुत धन्यवाद, एरिक! मैं आपका जवाब चुनता हूँ! ;) – Teerasej

+0

धन्यवाद, तेरसेज। मैंने जवाब सही होने के लिए अद्यतन किया। – erik

2

acts_as_tree में देखें। मैंने इसे प्रोजेक्ट वे पर प्रोजेक्ट पर इस्तेमाल किया, इसलिए मुझे यकीन नहीं है कि तब से यह कितना बदल गया है, लेकिन मुझे लगता है कि यह वही है जो आप खोज रहे हैं।

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